背景
假设我有这个命令
icacls C:\FullyAccessibleFolder /grant Users:(OI)(CI)F
这在 Windows 的英文版中可以正常工作,但似乎在法语版中不起作用,并出现以下错误,大概是因为Users
法语不同。Everyone
被翻译为Tout le monde
在 Windows 中,所以这也不是一个解决方案。
Users: Le mappage entre les noms de compte et les ID de sécurité n'a pas été effectué.
谷歌将其翻译为
Users: The mapping between account names and security IDs was not performed.
问题
是否有一个命令可以用来设置文件夹并递归地设置其中的所有内容,以便所有用户都拥有完全权限,并且能够在不同语言版本的 Windows 中工作?
来自网络的内容
这一页一个非常相似的问题讨论了德语和法语中的“如何Everyone
变成” 。Jeder
Tout le monde
答案1
不适用于法语版本,可能是因为Users
不同
您有三个选择,详情如下:
使用 使用语言门户获取翻译后的名字
Users
从SID中检索本地化名称使用
Users
SIDicacls
选项 1:使用语言门户(Microsoft 术语的规范资源)
搜索用户返回:
本地化 Microsoft 产品的翻译
English Translation Product
Users Utilisateurs Windows 7
Users des utilisateurs Windows 7
Users Utilisateurs Windows 8 Modern Voice
Users Utilisateurs Windows 8
Users Utilisateurs Windows 8.1
USERS UTILISATEURS Windows 8.1
Users Utilisateurs Windows 10
Users des utilisateurs Windows 10
Users Utilisateurs Windows 10 Anniversary Update
users utilisateurs Windows 10 Anniversary Update
这表明以下命令可能有效:
icacls C:\FullyAccessibleFolder /grant Utilisateurs:(OI)(CI)F
选项 2:从 SID 中检索本地化名称Users
( S-1-5-32-545
)
编号:S-1-5-32-545
名称:Users
描述:内置组。在操作系统初始安装后,唯一成员是 Authenticated Users 组。当计算机加入域时,Domain Users 组将添加到计算机上的 Users 组中。
要检索本地化的Users
组名称:
(S-1-5-32-545)
这个简单的脚本将为您提供给定 PC 上“用户”组的实际名称:Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set objAccount = objWMIService.Get ("Win32_SID.SID='S-1-5-32-545'") Wscript.Echo objAccount.AccountName
将其放入扩展名为 vbs 的文件中(我们假设
usersName.vbs
)。现在运行:
echo Y|for /f "delims=" %i in ('cscript -Nologo usersName.vbs') do cacls foldername /G "%i":F
来源Cacls、Windows 7、完全权限、本地名称经过威猛
选项 3:使用Users
带有icacls
使用以下命令:
icacls C:\FullyAccessibleFolder /grant *S-1-5-32-545:(OI)(CI)F
来源评论哈里·约翰斯顿
答案2
您需要通过 SID 编号而不是名称来指定 AD 组。
对于“EveryOne”、“Domain Users”等标准组,有标准化的 SID 编号,可在 MSDN 页面上找到知名安全标识符 (SID)。
以下是最常见的相对标识符。
SID的结构描述如下:
当使用标准符号将 SID 从二进制格式转换为字符串格式时,SID 的组件更容易直观地看到:
SRX-Y1-Y2-Yn-1-Yn
Component Definition S Indicates that the string is a SID R Revision level X Identifier authority value Y A series of subauthority values, where n is the number of values
例如,内置管理员组的 SID 以标准 SID 表示法表示为以下字符串:
编号:S-1-5-32-544
此 SID 有四个组成部分:
修订级别(1)
标识符权限值(5,NT 权限)
域标识符(32,内置)
相对标识符(544,管理员)
答案3
如果您喜欢 PowerShell 脚本,但又记不住 SID 的数字:
$acl = Get-Acl .\myfolder
$sid = New-Object System.Security.Principal.SecurityIdentifier ([System.Security.Principal.WellKnownSidType]::BuiltinUsersSid, $null)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule ($sid, 'FullControl', 'ObjectInherit,ContainerInherit', 'None', 'Allow')
$acl.AddAccessRule($rule)
Set-Acl .\myfolder $acl
我知道这看起来需要输入很多内容,但这些长标识符都是通过制表符完成的:
System.Security.Principal.SecurityIdentifier
从securityi
System.Security.Principal.WellKnownSidType
从wellknownsi
System.Security.AccessControl.FileSystemAccessRule
从filesystem
所有这些字符串都是 .NET 标识符,因此它们不会被本地化。
如果您想要的是Everyone
SID,请使用WorldSid
代替。要获取所有选项BuiltinUsersSid
的列表,WellKnownSidType
参见 MSDN或者运行这个命令:
[System.Security.Principal.WellKnownSidType].DeclaredFields | select Name
答案4
根据 DavidPostill 的选项 2,这里有一个将提供本地语言 SID 名称的批处理,优点是可以改用 CACLS(不能使用 ICACLS 设置 ReadOnly):
rem https://learn.microsoft.com/en-US/windows-server/identity/ad-ds/manage/understand-security-identifiers
set userSID=S-1-1-0& rem EVERYBODY
rem generate temp sid2user.VBS script to get local language userSID name
( echo\Set objWMIService = GetObject("winmgmts:\\.\root\cimv2"^)
echo\Wscript.Echo objWMIService.Get("Win32_SID.SID='%userSID%'" ^).AccountName
) > "%TEMP%\sid2user.vbs"
rem set lang_user to userSID local language name
for /F "delims=" %%i in ('cscript -Nologo "%TEMP%\sid2user.vbs"') do set lang_user=%%i
rem remove temp vbs file
del "%TEMP%\sid2user.vbs"
echo "%lang_user%"
rem set permissions with icacls
cacls C:\FullyAccessibleFolder /t /l /c /g "%lang_user%":F