Ошибка разрешения папки PowerShell. Некоторые или все ссылки на идентификаторы не могут быть переведены.

Я прочитал много сообщений об этом, но я до сих пор не могу его получить. Я запускаю этот script как Admin, и он создает резервные копии папок, просто не устанавливает соответствующие разрешения. Любая помощь будет оценена по достоинству. Спасибо!

$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

Я надеюсь, что это не дубликат, и я сожалею, если это так, я читал часами. Спасибо!

Ответ 1

Ошибка довольно понятна: Some or all identity references could not be translated.

Это означает, что учетная запись не найдена. Итак, что вам нужно сделать, это проверить свои учетные записи. Поскольку вы добавляете 4 ACE, вам нужно будет определить, что недействительно.

Самый простой способ сделать это - отлаживать сквозные строки, используя ISE или PowerGUI.

Я попробовал ваш код с "NT AUTHORITY\SYSTEM" и "BUILTIN\Administrators", и он работает, поэтому проблема связана с "O1OAK\$user" или "1OAK\$user". Вероятно, у вас есть недопустимая учетная запись в текстовом файле.

Ответ 2

Запуск с идентификатором пользователя заключается в том, что AD усекает имя пользователя, поэтому у пользователя с длинным именем "j_reallylongname" будет имя пользователя samid (имя учетной записи безопасности (SAM)), которое будет усечено. (J_reallylong)

поэтому, когда вы выбираете имена пользователей, убедитесь, что вы проверяете их перед использованием AD.

Когда у меня есть upns, поэтому я запускаю запрос dsget, чтобы получить samid, а затем использовать его для создания ссылки на идентификатор.

Ответ 3

Добавление этого в случае, если это получат разработчики на С#/ASP.NET (это мой сценарий, и я нашел этот пост).

Я использую .NET Core в корпоративной среде, и мне нужно проверять группы пользователей как часть безопасности. Код такой (где "пользователь" - это 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 я получил ошибку в названии. Выход из системы и/или перезагрузка работали просто отлично.

Ответ 4

Для меня это был случай, когда я проверил, знает ли выполнение скрипта пароль, используя $user = Get-Credential "username". мне пришлось превратить мой $user в $user.UserName, чтобы дать параметрам сценария значение, которое они ожидали