Установка разрешений для папок с помощью 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')
Другие вопросы по тегам