无论 Windows 语言是什么,我如何才能让 ICACLS 命令将文件夹设置为每个人都具有完全访问权限?

无论 Windows 语言是什么,我如何才能让 ICACLS 命令将文件夹设置为每个人都具有完全访问权限?

背景

假设我有这个命令

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变成” 。JederTout le monde

答案1

不适用于法语版本,可能是因为Users不同

您有三个选择,详情如下:

  1. 使用 使用语言门户获取翻译后的名字

  2. Users从SID中检索本地化名称

  3. 使用UsersSIDicacls


选项 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 组中。

来源Windows 操作系统中众所周知的安全标识符

要检索本地化的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.SecurityIdentifiersecurityi
  • System.Security.Principal.WellKnownSidTypewellknownsi
  • System.Security.AccessControl.FileSystemAccessRulefilesystem

所有这些字符串都是 .NET 标识符,因此它们不会被本地化。

如果您想要的是EveryoneSID,请使用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

相关内容