Powershell 设置Get Acl的输出语言

Powershell 设置Get Acl的输出语言,powershell,acl,multilingual,Powershell,Acl,Multilingual,我正在编写一个powershell脚本,它应该删除给定网络共享的特权 我使用: $folder = "Path\To\Folder\on\Share" $acl = Get-ACL -Path $Folder #Remove inheritance but copy ACE $acl.SetAccessRuleProtection($True, $True) Set-Acl -Path $folder -AclObject $acl $acl = Get-ACL -Path

我正在编写一个powershell脚本,它应该删除给定网络共享的特权

我使用:

 $folder = "Path\To\Folder\on\Share"

 $acl = Get-ACL -Path $Folder

 #Remove inheritance but copy ACE
 $acl.SetAccessRuleProtection($True, $True)

 Set-Acl -Path $folder -AclObject $acl

 $acl = Get-ACL -Path $Folder

 $accessrule = New-Object system.security.AccessControl.FileSystemAccessRule("VORDEFINIERT\Benutzer","Read",,,"Allow")

 $acl.RemoveAccessRuleAll($accessrule)

 Set-Acl -Path $folder -AclObject $acl
这应该在保留现有特权的同时删除继承,然后删除
“BUILTIN\Users”
的所有权限

不幸的是,我的系统语言是德语,因此编写
“BUILTIN\Users”
“\Users”
无法工作,因为它会自动翻译Get ACL的输出,我必须编写德语翻译
“VorDefinitiert\Benutzer”

这是非常不愉快的,因为脚本应该在使用不同操作系统语言的服务器系统上运行,我必须为每种语言编写一条规则

问题 如何强制powershell以英语输出?有更好的方法吗?

因为,您应该使用安全标识符。这是一本书。您可能希望执行以下操作:

# ...
$sidName = ([wmi]"Win32_SID.SID='S-1-5-32-545'").AccountName
$accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($sidName,"Read",,,"Allow")
同样,您应该使用安全标识符。这是一本书。您可能希望执行以下操作:

# ...
$sidName = ([wmi]"Win32_SID.SID='S-1-5-32-545'").AccountName
$accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($sidName,"Read",,,"Allow")

改为使用内置组的安全标识符(始终相同):


因为您可以使用WMI根据SID查找用户或组帐户,但如果您需要本地化名称,也可以将
SecurityIdentifier
对象转换为类似的帐户:

PS> $BuiltinUsersSID = New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-32-545'
PS> $BuiltinUsersGroup = $BuiltinUsersSID.Translate([System.Security.Principal.NTAccount])
PS> $BuiltinUsersGroup.Value # This would output VORDEFINIERT\Benutzer on a system with german locale
BUILTIN\Users

改为使用内置组的安全标识符(始终相同):


因为您可以使用WMI根据SID查找用户或组帐户,但如果您需要本地化名称,也可以将
SecurityIdentifier
对象转换为类似的帐户:

PS> $BuiltinUsersSID = New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-32-545'
PS> $BuiltinUsersGroup = $BuiltinUsersSID.Translate([System.Security.Principal.NTAccount])
PS> $BuiltinUsersGroup.Value # This would output VORDEFINIERT\Benutzer on a system with german locale
BUILTIN\Users


使用已知安全标识符而不是组名称使用已知安全标识符而不是组名称我通过1获得了组的SID$AdObj=新对象System.Security.Principal.NTAccount(“域用户”)2$strId=$AdObj.Translate([System.Security.Principal.SecurityIdentifier])3$strId.Value在代码中插入生成的SID不会产生错误,但不会更改文件权限,就像没有用户提供一样。哦,我忘记了域名,请尝试:
$sidName='{0}\{1}'-f([wmi]“Win32_SID.SID='S-1-5-32-545'))。ReferenceDomainName,([wmi]“Win32_SID.SID='S-1-5-32-545')).AccountName
$sidName的输出是正确的(\Domain Users),但问题仍然存在。再次键入所有内容后,它的效果非常好,非常感谢。我在1之前获得了用户的SID$AdObj=新对象System.Security.Principal.NTAccount(“域用户”)2$strId=$AdObj.Translate([System.Security.Principal.SecurityIdentifier])3$strId.Value在代码中插入生成的SID不会产生错误,但不会更改文件权限,就像没有用户提供一样。哦,我忘记了域名,请尝试:
$sidName='{0}\{1}'-f([wmi]“Win32_SID.SID='S-1-5-32-545'))。ReferenceDomainName,([wmi]“Win32_SID.SID='S-1-5-32-545')).AccountName
$sidName的输出是正确的(\Domain Users),但问题仍然存在。再次键入所有内容后,它非常有效,非常感谢您喜欢这种方式,而不是我的WMI方式。我采用了此解决方案。非常感谢您的帮助马蒂亚斯和@MartinBrandl@MartinBrandl您也可以在不使用WMI的情况下获取帐户名,也可以检查我的UpdateAnks。这将进入我的代码段集合;-)我比我的WMI方法更喜欢这个。我采用了这个解决方案。非常感谢您的帮助马蒂亚斯和@MartinBrandl@MartinBrandl您也可以在不使用WMI的情况下获取帐户名,也可以检查我的UpdateAnks。这将进入我的代码段集合;-)