2017-04-11 49 views
0

我想在一個文件夾上設置所有者,我不斷遇到問題。這是我目前的腳本。我試圖解析共享下的所有文件夾,並根據文件夾的名稱將文件夾的所有者設置爲相應的ADUser。文件夾名稱是SAMAccountNames。Powershell:如何將ADUser轉換爲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 
} 

我來到這裏,雖然是錯誤:

無法轉換參數「同一性」的值(此處插入專有名稱)爲「SetOwner」鍵入System.Security.Principal.IdentityReference

什麼是更好的方法來做到這一點?

+1

你可以用'新物體System.Security.Principal.NTAccount'喜歡:'$ objUser =新物體System.Security.Principal.NTAccount( 「」, 「」); $ acl.SetOwner($ objUser)' – Matt

+0

我認爲這有效,但有幾個文件夾出現錯誤,提示「某些或全部標識引用無法翻譯」。 –

+0

不知道當用戶標識不存在時,該錯誤似乎發生。有沒有辦法處理錯誤? –

回答

0

假設這是一個域,您可以使用用戶的samaccountname創建一個System.Security.Principal.NTAccount對象,該對象可以與.SetOwner()方法一起使用。

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

正如您發現用戶可能不存在,所以您需要對此進行解釋以減輕將來的錯誤。一個簡單的方法是檢查Get-Aduser

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

注意結果。如果得到的用戶因爲的任何而失敗,這會引發其他問題。 DC不可用,用戶沒有找到,權限錯誤等

如果你想要更多的控制,那麼你可以嘗試try/catch尋找的特定錯誤等

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

顯然它不工作,雖然我能夠使用try catch方法處理錯誤。問題是添加Set-Acl命令時出現錯誤 - 請參閱我更新的腳本。我得到「安全標識符不被允許爲該對象的所有者。」 - 不知道這意味着什麼。 –

0

感謝馬特對他的一些對此有所幫助,但答案結果有點不同。這是最後的工作產品。

重要提示:腳本必須從另一臺計算機上運行,​​理想的Windows 2012年或更高版本,否則你會得到一個錯誤說「的安全標識符不允許是這個對象的所有者」。

$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" 
    } 
}