Установка разрешений для папок с помощью PowerShell в разных культурах
Я пытаюсь создать сценарий PowerShell, который предоставляет разрешения для папки NETWORK SERVICE в разных культурах. Основная проблема заключается в том, что NETWORK SERVICE, хотя и присутствует во всех установках Windows, имеет разные названия в разных культурах, и я не знаю, как с этим справиться.
Вот скрипт, который я использую:
$appPath = "C:\SomeFolder"
$Acl = (Get-Item $appPath).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("NETWORK SERVICE", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$Acl.SetAccessRule($Ar)
Set-Acl $appPath $Acl
Теперь этот скрипт отлично работает на английских версиях Windows. Тем не менее, при попытке запустить его на немецкой версии Windows, я получаю следующее сообщение об ошибке (перевод с немецкого):
Исключение вызывает "SetAccessRule" с аргументом (ами) "1": "Некоторые или все идентификаторы ссылки не могут быть переведены ". В C:\Experimental Files\GrantFolderPermissions.ps1:7 char:1 + $Acl.SetAccessRule($Ar) + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], исключение MethodInvocationException + FullyQualifiedErrorId: IdentityNotMappedException
Как мне лучше всего справиться с этим, чтобы этот скрипт работал независимо от культуры?
1 ответ
Решение
Используйте известный SID для определения имени учетной записи:
$sid = [Security.Principal.SecurityIdentifier]'S-1-5-20'
$acct = $sid.Translate([Security.Principal.NTAccount]).Value
$ace = New-Object Security.AccessControl.FileSystemAccessRule($acct, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow')