2017-04-11 4 views
0

Ich versuche, den Besitzer auf einen Ordner zu setzen und ich laufe auf Probleme. Hier ist mein aktuelles Skript. Ich versuche, alle Ordner unter einer Freigabe zu analysieren und den Besitzer des Ordners anhand des Ordnernamens auf den entsprechenden ADUser festzulegen. Ordnernamen sind SAMAccountNames.Powershell: Wie konvertiere ich ADUser in IdentityReference?

Import-Module ActiveDirectory 

$path = Get-ChildItem F:\AppData\*\ | ?{ $_.PSIsContainer } 
ForEach ($folder in $path) { 
    $ACL = get-acl $folder 
    $username = $folder.Name 
    $userobject = Get-ADUser $username 
    $ACL.SetOwner($userobject) 
    Set-Acl $folder.FullName $ACL 
    Write-Host $username 
} 

Der Fehler, den ich hier allerdings ist:

Kann Argument "Identität" mit dem Wert (einfügen Distinguished Name hier) für "SetOwner" nicht konvertieren geben System.Security.Principal.IdentityReference

Was ist eine bessere Möglichkeit, dies zu tun?

+1

können Sie 'verwenden New-Object System.Security.Principal.NTAccount' mag:' $ objUser = New-Object System.Security.Principal.NTAccount ("", ""); $ acl.SetOwner ($ objUser) ' – Matt

+0

Ich denke, das funktioniert, aber ein paar Ordner erhalten eine Fehlermeldung, dass" Einige oder alle Identitätsreferenzen konnten nicht übersetzt werden. " –

+0

Vergesst nicht, dass der Fehler auftritt, wenn die Benutzer-ID nicht existiert. Gibt es eine Möglichkeit, mit Fehlern umzugehen? –

Antwort

0

Angenommen, dies ist eine einzelne Domäne, könnten Sie den samaccountname des Benutzers verwenden, um ein System.Security.Principal.NTAccount-Objekt zu erstellen, das mit der .SetOwner()-Methode arbeiten würde.

$userobject = Get-ADUser $folder.Name 
$ACL.SetOwner(New-Object System.Security.Principal.NTAccount("bagel", $userobject.samaccountname)) 

Wie Sie fand es möglich ist, dass ein Benutzer nicht so existieren könnte Sie, dass, um Konto müssten zukünftige Fehler zu mildern. Ein einfacher Weg ist das Ergebnis der Get-Aduser

$userobject = Get-ADUser $folder.Name -ErrorAction SilentlyContinue 
if($userobject){ 
    # Found it. Do stuff 
} else { 
    # Could not find it. Do different stuff 
} 

HINWEIS zu überprüfen. Wenn der Benutzer für keine Grund schlägt, wird dies sonst auslösen. DC nicht verfügbar, Benutzer nicht gefunden, Berechtigungsfehler usw.

Wenn Sie mehr Kontrolle wünschen, dann können Sie einen try/catch versuchen, für die spezifischen Fehler suchen usw.

try{ 
    Get-ADUser "cantpossiblyexist" 
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{ 
    "No. Mr. User not here" 
} 
+0

Anscheinend funktioniert es überhaupt nicht, obwohl ich in der Lage war, Fehler mit der Methode try catch zu behandeln. Das Problem ist, dass beim Hinzufügen des Set-Acl-Befehls ein Fehler auftritt - siehe mein aktuelles Skript. Ich bekomme "Die Sicherheitskennung darf nicht der Besitzer dieses Objekts sein." - Keine Ahnung, was das im Moment bedeutet. –

0

Dank Matt für einige seiner Hilfe dabei, aber die Antwort endete ein bisschen anders. Hier ist das letzte funktionierende Produkt.

WICHTIGER HINWEIS: Das Skript muss von einem anderen Computer aus ausgeführt werden, idealerweise Windows 2012 oder höher, andernfalls wird die Fehlermeldung "Die Sicherheitskennung darf nicht Eigentümer dieses Objekts sein" angezeigt.

$path = Get-ChildItem \\COMPUTERNAME\SHARENAME\* | ?{ $_.PSIsContainer } 
ForEach ($folder in $path) { 
    $ACL = (get-item $folder.FullName).GetAccessControl('Owner') 
    $username = $folder.Name 
    $userobject = New-Object System.Security.Principal.NTAccount("NTDOMAIN", $username) 
    $AccessRule1 = New-Object system.security.accesscontrol.filesystemaccessrule("CREATOR OWNER","FullControl","ContainerInherit, ObjectInherit","InheritOnly","Allow") 
    $AccessRule2 = New-Object system.security.accesscontrol.filesystemaccessrule("Domain Admins","FullControl","ContainerInherit, ObjectInherit","InheritOnly","Allow") 
    $AccessRule3 = New-Object system.security.accesscontrol.filesystemaccessrule($userobject,"FullControl","ContainerInherit, ObjectInherit","InheritOnly","Allow") 

    try { 
     $ACL.SetOwner($userobject) 
     $ACL.AddAccessRule($AccessRule1) 
     $ACL.AddAccessRule($AccessRule2) 
     $ACL.AddAccessRule($AccessRule3) 
     Set-Acl $folder.FullName $ACL 
     Write-Host $username 
    } 
    catch { 
     #Delete folder if user is not found. 
     Remove-Item $folder -recurse -force 
     Write-Host $username "CANNOT BE FOUND" 
    } 
} 
Verwandte Themen