Вопрос по windows, file-permissions, powershell – Ошибка разрешения папки PowerShell - некоторые или все ссылки на идентификаторы не могут быть переведены.

8

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

$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-й $ accessRule имеет параметр идентификации, имеет доменное имя «O1OAK». 4-й "1OAK". это верно? CB.

Ваш Ответ

3   ответа
17

Some or all identity references could not be translated.

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

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

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

Благодарю. Человек, это глупая ошибка. Клянусь, я проверяю, читаю это весь день. Я думаю, что это только начало выглядеть правильно со временем. Извините за беспокойство и спасибо за время. Siriss
1

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

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

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

0

Добавление этого в случае, если это получат разработчики на C # / 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 я получил ошибку в названии. Выход из системы и / или перезагрузка работали просто отлично.

Похожие вопросы