2013-02-15 6 views
5

Sto eseguendo uno script PowerShell che crea nuovi account utente di dominio in AD e crea anche directory home nel file server con autorizzazioni pertinenti.Script di PowerShell che crea la cartella principale per l'utente e le autorizzazioni di impostazione

Il mio problema è che non riesco a ottenere le autorizzazioni impostate.

Nel seguente codice, my_fileServer è il nome del file server; sso significa id single-sign-on, che nel codice di test sottostante è impostato su "user9999".

Qualsiasi aiuto è molto apprezzato!

Set-Variable homeDir -option Constant -value "\\my_fileServer\Users" 
Set-Variable sso -option Constant -value "user9999" 

# If the folder for the user does not exist, make a new one and set the correct permissions. 
if ((Test-Path "$homeDir\$sso") -eq $false) 
{ 
    try 
    { 
     $NewFolder = New-Item -Path $homeDir -Name $sso -ItemType "Directory" 
     $Rights = [System.Security.AccessControl.FileSystemRights]"FullControl,Modify,ReadAndExecute,ListDirectory,Read,Write" 
     $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
     $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
     $objType =[System.Security.AccessControl.AccessControlType]::Allow 
     $objUser = New-Object System.Security.Principal.NTAccount "my_full_domain_name\$sso" 
     $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ` 
       ($objUser, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
     $ACL = get-acl -Path $NewFolder 
     $ACL.AddAccessRule($objACE) 
     $objReturn = Set-ACL -Path "$homeDir\$sso" -AclObject $ACL 
    $objReturn 
    } 
    catch 
    { 
     $msg = $_ 
     $msg 
    } 
} 

La cartella Inizio viene creata OK, ma quando controllo le autorizzazioni per l'utente, nessuna casella è spuntata. enter image description here

+0

Set-Acl non restituisce un valore. –

risposta

6

Il problema è la tua inerzia. Non stai permettendo il permesso di essere ereditato su sottocartelle e file (oggetti che possiede nella sua cartella). Ecco perché non vedi le autorizzazioni (solo "Autorizzazione speciale") nella finestra di sicurezza di base. Se apri "Impostazioni di sicurezza avanzate" vedrai che l'utente ha il pieno controllo su QUESTA cartella e non i contenuti. Finché si aggiungono le autorizzazioni (con ereditarietà) per CREATOR OWNER in modo che il proprietario possa accedere agli elementi, penso che starai bene. Tuttavia, si potrebbe risolvere il problema già ora così:

$InheritanceFlag = @([System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit) 

A meno che non ci sono esigenze particolari, si dovrebbe dare agli utenti l'accesso completo sopra la sua cartella (eredità pieno). Soluzione completa con l'ereditarietà fissa (ho anche ripulito il vostro percorso Set-ACL e rimosso returnobject inutili):

try 
{ 
    $NewFolder = New-Item -Path $homeDir -Name $sso -ItemType "Directory" 
    $Rights = [System.Security.AccessControl.FileSystemRights]"FullControl,Modify,ReadAndExecute,ListDirectory,Read,Write" 
    $InheritanceFlag = @([System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit) 
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
    $objType =[System.Security.AccessControl.AccessControlType]::Allow 
    $objUser = New-Object System.Security.Principal.NTAccount "my_full_domain_name\$sso" 
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ` 
      ($objUser, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
    $ACL = Get-Acl -Path $NewFolder 
    $ACL.AddAccessRule($objACE) 
    Set-ACL -Path $NewFolder.FullName -AclObject $ACL 
} 
+0

Grazie mille !! ora capisco perché .. – user1866880

0

Tutti i permessi sono impostati correttamente come 'Special Permmissions', è possibile controllare cliccando sul Advanced e guardare scheda 'autorizzazione'.

2

io purtroppo non posso votare, ma sono d'accordo con entrambe le risposte di cui sopra (Graimer e CB), la risposta reale è una combinazione di entrambi.
- È necessario verificare le autorizzazioni nella finestra "avanzata"
- Anche se il codice "funziona", senza ereditarietà gli utenti non saranno in grado di fare molto nella cartella che li assegna.

0

Resta semplice, fallo con meno ... Ciò che ti è mancato è la funzione SetAccessRuleProtection.

Ecco il codice che ti darà le zecche che desideri.

if (-not (Test-Path "$homeDir\$sso")) 
{ 
    $acl = Get-Acl (New-Item -Path $homedir -Name $sso -ItemType Directory) 

    # Make sure access rules inherited from parent folders. 
    $acl.SetAccessRuleProtection($false, $true) 

    $ace = "$domain\$sso","FullControl", "ContainerInherit,ObjectInherit","None","Allow" 
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($ace) 
    $acl.AddAccessRule($objACE) 
    Set-ACL -Path "$homeDir\$sso" -AclObject $acl 

} 
Problemi correlati