web-dev-qa-db-ja.com

PowerShellフォルダーのアクセス許可エラー-一部またはすべてのID参照を翻訳できませんでした。

私はこれについて多くの記事を読みましたが、それでもまだそれを得ることができません。このスクリプトを管理者として実行していますが、必要なフォルダーが作成されますが、適切なアクセス許可が設定されていません。任意の助けいただければ幸いです。ありがとうございました!

$Users = Get-Content "D:\New_Users.txt"
ForEach ($user in $users)
{
    $newPath = Join-Path "F:\Users" -childpath $user
    New-Item $newPath -type directory

    $UserObj = New-Object System.Security.Principal.NTAccount("DOMAIN",$user)

    $acl = Get-Acl $newpath
    $acl.SetAccessRuleProtection($True, $False)
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("O1Oak\$user","AppendData,CreateDirectories,CreateFiles,DeleteSubdirectoriesAndFiles,ExecuteFile,ListDirectory,Modify,Read,ReadAndExecute,ReadAttributes,ReadData,ReadExtendedAttributes,ReadPermissions,Synchronize,Traverse,Write,WriteAttributes,WriteData,WriteExtendedAttributes","ContainerInherit, ObjectInherit","None","Allow")
    $acl.SetAccessRule($accessRule)
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\SYSTEM","FullControl","ContainerInherit, ObjectInherit","None","Allow")
    $acl.SetAccessRule($accessRule)
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Administrators","FullControl","ContainerInherit, ObjectInherit","None","Allow")
    $acl.SetAccessRule($accessRule)
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("1Oak\$user","Delete","ContainerInherit, ObjectInherit","None","Allow")
    $acl.removeAccessRule($accessRule)
    $acl.SetOwner($UserObj)
    $acl | Set-Acl $newpath
}

私が取得する3の文字列の最初のエラーは以下のとおりです。私はそれが最も重要であり、他の2を修正すると思います。

Exception calling "SetAccessRule" with "1" argument(s): "Some or all identity references could not be translated."
At D:\DOMAIN\IT\IT Private\User Drives\user_folders.ps1:12 char:20
+     $acl.SetAccessRule <<<< ($accessRule)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

これが重複していないことを願っています。重複しているとすみません。何時間も読んでいます。ありがとうございました!

14
Siriss

エラーはかなり自明です:Some or all identity references could not be translated.

これは、アカウントが見つからなかったことを意味します。だからあなたがしなければならないことはあなたのアカウントを確認することです。 4つのACEを追加するので、どれが無効であるかを特定する必要があります。

これを行う最も簡単な方法は、ISEまたはPowerGUIを使用して1行ずつデバッグすることです。

"NT AUTHORITY\SYSTEM"と "BUILTIN\Administrators"を使用してコードを試したところ、問題は"O1Oak\$user"または"1Oak\$user"。テキストファイルに無効なアカウントがある可能性があります。

20
Andy Arismendi

C#/ ASP.NET開発者がこれを取得した場合に備えてこれを追加します(これは私のシナリオであり、この投稿を見つけました)。

企業環境で.NET Coreを使用していますが、セキュリティの一環としてユーザーグループを確認する必要があります。コードは次のようになります( "user"はClaimsPrincipalです):

var windowsIdentity = user.Identity as WindowsIdentity;
if( windowsIdentity is null )
    throw new Exception( $"Invalid Windows Identity {user.Identity.Name}" );
return windowsIdentity.Groups
    .Select( g => g.Translate( typeof( NTAccount ) ).Value );

とにかく、グループの担当者が私が所属していたグループを削除したため、ADレプリケーションの遅延により、タイトルにエラーが表示されました。ログオフまたは再起動、あるいはその両方が正常に機能しました。

1
emery.noel

ユーザーIDの問題は、ADがユーザー名を切り捨てることです。そのため、長い名前 "j_reallylongname"のユーザーは、切り捨てられるsamid(セキュリティアカウントマネージャー(SAM)アカウント名)を持ちます。 (j_reallylong)

したがって、ユーザー名を取得するときは、ADを使用する前にADに対して確認してください。

Upnsを取得したら、dsgetクエリを実行してsamidを取得し、それを使用してID参照を構築します。

1
flow in

私にとっては、スクリプトの実行が$user = Get-Credential "username"を使用してパスワードを知っているかどうかを確認する場合でした。私は$user$user.UserNameに変換する必要がありました

0
Dbl