在不同文化中使用 PowerShell 设置文件夹权限

Posted

技术标签:

【中文标题】在不同文化中使用 PowerShell 设置文件夹权限【英文标题】:Set folder permissions with PowerShell in different cultures 【发布时间】:2018-02-02 16:11:42 【问题描述】:

我正在尝试创建一个 PowerShell 脚本,该脚本将文件夹权限授予不同文化的 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 上运行它时,我收到以下错误消息(翻译自德语):

使用“1”参数调用“SetAccessRule”的异常:“部分或全部身份 无法翻译参考文献。” 在 C:\Experimental Files\GrantFolderPermissions.ps1:7 char:1 + $Acl.SetAccessRule($Ar) + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IdentityNotMappedException

我怎样才能最好地处理这个问题,以便这个脚本能够独立地工作?

【问题讨论】:

使用well-known sid types构造一个SecurityIdentifier 【参考方案1】:

使用well-known 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')

【讨论】:

以上是关于在不同文化中使用 PowerShell 设置文件夹权限的主要内容,如果未能解决你的问题,请参考以下文章

在不同的文化中设置 MS SQL 登录角色

英语非美国文化问题

如何更改 Azure 函数中的 PowerShell 文化

在 C# 中使用不同的凭据调用远程 powershell 脚本

了解 get-culture 命令

更改 Powershell 会话的当前文化,特定于 v3.0+