2017-04-11 32 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

:' $ objUserを=新オブジェクトSystem.Security.Principal.NTAccount( ""、 ""); $ acl.SetOwner($ objUser) ' – Matt

+0

これはうまくいくと思いますが、いくつかのフォルダに「一部またはすべてのID参照を翻訳できませんでした」というエラーが表示されます。 –

+0

このエラーは、ユーザーIDが存在しない場合に発生します。エラーを処理する方法はありますか? –

答えて

0

これが単一のドメインであると仮定すると、.SetOwner()メソッドで動作するSystem.Security.Principal.NTAccountオブジェクトを作成するために、ユーザーのsamaccountnameを使用できます。

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

NOTEの結果をチェックすることです。ユーザがに失敗した場合は、のいずれかの理由でこれがelseをトリガします。 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以降で理想的に、他のコンピュータから実行する必要があり、そうしないと、エラーが言ってしまいます「セキュリティ識別子は、このオブジェクトの所有者であることを許可されていません。」あなたは `新オブジェクトが好きSystem.Security.Principal.NTAccount`使用することができます

$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" 
    } 
} 
関連する問題