【问题标题】:How to grant permission to users for a directory using command line in Windows?如何在 Windows 中使用命令行向用户授予目录权限?
【发布时间】:2011-02-25 02:29:32
【问题描述】:

如何使用 Windows 命令行向用户授予对目录的权限(读取、写入、修改)?

【问题讨论】:

  • 我们以特定用户帐户运行 apache 服务,这是否允许 apache 以完全权限访问文档根目录?

标签: windows command-prompt file-permissions


【解决方案1】:

从 Vista 开始,cacls 已被弃用。这是前几行帮助:

C:\>cacls
NOTE: Cacls is now deprecated, please use Icacls.

Displays or modifies access control lists (ACLs) of files

您应该改用icacls。这就是您授予 John 完全控制 D:\test 文件夹及其所有子文件夹的方式:

C:\>icacls "D:\test" /grant John:(OI)(CI)F /T

根据 MS 文档:

  • F = 完全控制
  • CI = Container Inherit - 此标志表示从属容器将继承此 ACE。
  • OI = 对象继承 - 此标志表示从属文件将继承 ACE。
  • /T = 递归应用到现有文件和子文件夹。 (OICI 仅适用于新文件和子文件夹)。信用:@AlexSpence 的评论。

对于完整的文档,您可以运行不带参数的“icacls”或查看 Microsoft 文档 herehere

【讨论】:

  • Felipe:(OI) 和 (CI) 参数使这个递归
  • 我在尝试更改 Windows 资源管理器 UI 中的权限时遇到访问被拒绝的问题。在末尾添加 /T 标志替换了现有对象,并且能够为我解决问题。 C:>icacls "D:\test" /grant John:(OI)(CI)F /T
  • @AlexSpence 好点! /T 用于更新现有文件和文件夹的权限。 (OI) 和 (CI) 仅适用于将来创建的文件和文件夹。
  • 来自 *nix 世界并习惯于 'chown/chmod' 通过 CLI 授予访问权限和设置权限,此线程非常有帮助。
  • 如果您在 Windows 10 的 Powershell 中运行此程序,您将收到有关“OI 无法识别”的错误。解决方案:将 user+perms 参数放在引号中。例如:C:\>icacls "D:\test" /grant "John:(OI)(CI)F" /T
【解决方案2】:

您也可以使用 ICACLS。

要将用户完全控制授予文件夹:

>icacls "C:\MyFolder" /grant Users:F

向 IIS 用户授予 C:\MyFolder修改权限(如果您需要您的 IIS 能够将文件读/写到特定文件夹中):

>icacls "C:\MyFolder" /grant IIS_IUSRS:M

如果您执行 ICACLS /?,您将能够看到所有可用选项。

【讨论】:

  • 鉴于cacls 已不复存在,使用icacls 的理由更是更多
  • 在使用 /grant Users:(OI)(CI)F 之前添加完全控制对我不起作用
  • 我是否需要将Users 替换为其他内容或否?根据icacls "C:\MyFolder" /grant Users:F
  • 如果当前用户是名为“Users”的用户组的成员(在 Windows 7 上通常是这种情况),那么授予该组权限将影响该组的访问权限当前用户。在任何其他情况下,将名称 Users 替换为当前用户的实际名称(例如 John),例如:/grant John:(OI)(CI)F
【解决方案3】:

打开命令提示符,然后执行以下命令:

icacls "c:\somelocation\of\path" /q /c /t /grant Users:F

F 提供完全访问权限。

/q /c /t 将权限应用于子文件夹。

注意:有时“以管理员身份运行”会有所帮助。

【讨论】:

  • 需要“以管理员身份运行”,简直就是最佳答案!
  • 您好,我想为一位用户设置最低权限。例如,我们在 Windows Server 中有一个应用程序。所以这个用户只需要访问这个应用程序而不是任何其他服务。就像用户不应该访问任何浏览器,不应该访问任何文件资源管理器,不应该访问任何磁盘存储一样。此用户应仅访问一个独立应用程序。是否可以使用 windows 命令或 windows 服务器中的任何脚本来完成这种情况?
【解决方案4】:

使用cacls 命令。查看信息here

CACLS 文件 /e /p {USERNAME}:{PERMISSION}

在哪里,

/p : 设置新权限

/e : 编辑权限并保持旧权限不变,即编辑 ACL 而不是替换它。

{USERNAME} : 用户名

{PERMISSION} :权限可以是:

R - 读取

W - 写

C - 更改(写入)

F - 完全控制

例如,使用以下命令授予 Rocky Full (F) 控制权(在 Windows 命令提示符下键入):

C:> CACLS 文件 /e /p rocky:f

通过键入以下命令阅读完整的帮助:

C:> cacls /?

【讨论】:

  • 很好的答案!唯一需要注意的是,文件是您要更改权限的实际文件。也许 [files] 或 {files} 会是更好的解释。
  • cacls 是相关的;它仍然在Windows 10 中可用; Microsoft 也会弃用 cmd.exe 以支持 Powershell。
  • @Chinggis6 “仍然可用”并不意味着使用或推荐其他人使用某些东西是一个好主意。此外,cmd.exe 没有被弃用,也不太可能被弃用,所以这根本不是支持icacls 的重点,恰恰相反。
  • 我知道。我没有说明使用或推荐cacls.exe 是否是个好主意。我也没有提到 cmd.exe 已被弃用。我认为人们至少应该意识到它在更高版本中的可用性,即使只是为了向后兼容或任何其他原因。
  • 加一个用于包含 /e 参数以编辑而不是替换文件的权限
【解决方案5】:

我尝试了以下方法,它对我有用:
1.打开cmd.exe
2.takeown /R /F *.*
3.icacls * /T /grant [username]:(D)
4.del *.* /S /Q

这样文件就可以成为我自己的访问权限并分配给“删除”,然后我可以删除文件和文件夹。

【讨论】:

  • 不要运行 del . /S /Q。它将开始删除根目录中的所有文件。
【解决方案6】:

损坏的权限:重新获得对文件夹及其子对象的访问权限

尽管针对该问题发布的大多数答案都有一些优点,但恕我直言,它们都没有给出完整的解决方案。如果您因权限设置损坏而无法访问文件夹,则以下(可能是)适合 Windows 7 的完美解决方案:

icacls "c:\folder" /remove:d /grant:r Everyone:(OI)(CI)F /T  

对于 Windows 10,用户/SID 必须在 /remove:d 选项之后指定:

icacls "c:\folder" /remove:d Everyone /grant:r Everyone:(OI)(CI)F /T  

.
备注

  1. 命令应用于指定目录。

  2. 指定用户“Everyone”会设置尽可能广泛的权限,因为它包括每个可能的用户。

  3. 选项“/remove:d”会删除任何可能存在的显式 DENY 设置,因为这些设置会覆盖显式 ALLOW 设置:这是创建新 ALLOW 设置的必要前提。 这只是一种预防措施,因为通常没有 DENY 设置,但总比抱歉更安全。

  4. 选项“/grant”创建一个新的 ALLOW 设置,一个显式权限替换 (“:r”) 任何和所有可能存在的显式 ALLOW 设置。

  5. “F”参数(即创建的权限)使其成为完全控制的授予。

  6. “/T”参数添加递归,将这些更改应用于指定目录(即文件和子文件夹)中的所有当前子对象,以及文件夹本身。

  7. “(OI)”和“(CI)”参数还添加了递归,将这些更改应用于随后创建的子对象。
    .

附录 (2019/02/10) -

今天有人向我推荐了 Windows 10 命令行上面,所以就在这里。我还没有 Windows 10 来测试它,但如果你有,请尝试一下(然后请你在下面发表评论)。

更改仅涉及作为第一步删除拒绝设置。很可能不存在任何 DENY 设置,因此该选项可能没有任何区别。我的理解是,在 Windows 7 上,您不需要在 /remove:d 之后指定用户,但我可能错了!

附录(2019 年 11 月 21 日) -

用户 astar 建议将 Everyone 替换为 *S-1-1-0,以使命令与语言无关。我只有英文版的 Windows,所以我无法测试这个提议,但它似乎是合理的。

【讨论】:

  • 不需要为 INHERITED 权限提供任何设置,因为 EXPLICIT 权限会覆盖它们。因此,新的显式设置的创建会使任何可能存在的继承设置无效(因为新的显式设置包括递归)。
  • Invalid parameter "/remove:d"
  • 我正在 Windows 7 上运行(只能运行)icacls.exe。我无法评论或测试 Windows 8 或 10 上可能存在的任何更改。正如我在Windows 7 64 位,remove 选项对删除 DENY 设置有效。如果没有拒绝设置,则使用它可能会导致错误消息,但如果没有拒绝设置,则无论如何它都无法删除它们。
  • 未能在我的原始答案中重现 完全 命令行(保存为目录路径)将导致命令失败。特别是,不要添加任何不在我的答案中的引号。如果您将(例如)/remove:d 选项用引号括起来,该命令当然会失败。
  • @DFSFOT 好吧,我很同情。但我使用的是 Windows 7。靠着上帝的恩典,我将永远使用 Windows 10。我宁愿迁移到 Ubuntu!我怀疑 /remove:g 可能会删除所有权限,包括 ALLOW 和 DENY 条目(尽管在这种情况下,'granted' 可能仅意味着 ALLOW,因此它不会处理任何 DENY条目);而 /remove:d 可能 only 删除 DENY 条目,而保留任何 ALLOW 条目不变。但我当然不能确定。
【解决方案7】:

我为此苦苦挣扎了一段时间,只有结合这个线程中的答案对我有用(在 Windows 10 上):
1. 打开 cmd 或 PowerShell 并进入包含文件的文件夹
2. takeown /R /F .
3. icacls * /T /grant dan:F

祝你好运!

【讨论】:

    【解决方案8】:

    使用 Excel vba 脚本来配置和创建帐户。我需要向我们的新用户授予对该工具使用我们的管理员“x”帐户创建的文件夹和子文件夹的完全权限。

    cacls 看起来像这样: cacls \FileServer\Users\Username /e /g Domain\Username:C

    我需要将此代码迁移到 Windows 7 及更高版本。我的解决方案原来是:

    icacls \FileServer\Users\用户名 /grant:r 域\用户名:(OI)(CI)F /t

    /grant:r - 授予指定的用户访问权限。权限替换以前授予的显式权限。如果没有 :r,权限将添加到任何先前授予的显式权限

    (OI)(CI) - 此文件夹、子文件夹和文件。

    F - 完全访问权限

    /t - 遍历所有子文件夹以匹配文件/目录。

    这给了我这个服务器上的一个文件夹,用户只能看到该文件夹​​并创建子文件夹,他们可以读取和写入文件。以及创建新文件夹。

    【讨论】:

      【解决方案9】:

      以防万一其他人在此页面上绊倒,如果您想在一个命令中将各种权限串在一起,我使用了这个:

      icacls "c:\TestFolder" /grant:r Test_User:(OI)(CI)(RC,RD,RX)
      

      注意各种权限的 csv 字符串。

      【讨论】:

      • 非常感谢。它帮助我设置了 RX & RD 的权限。在互联网上给出的大多数示例中,都使用 /F 完全权限进行了解释,这不应该是大小写。
      【解决方案10】:

      XCACLS.VBS 是一个非常强大的脚本,可以更改/编辑 ACL 信息。 c:\windows\system32\cscript.exe xcacls.vbs help 返回所有开关和选项。

      您可以从Microsoft Support Page获得官方分发

      【讨论】:

      【解决方案11】:

      使用以下 powershell 脚本创建批量文件夹和授予权限。

      Import-Csv "D:\Scripts\foldernames.csv" | foreach-object {
          $username = $_.foldername 
      
          # foldername is the header of csv file
      
          $domain = “example.com”
      
          $folder= "D:\Users"
      
          $domainusername = $domain+“\”+$username
      
          New-Item $folder\$username –Type Directory
      
          Get-Acl $folder\$username  
      
          $acl = Get-Acl $folder\$username
      
          $acl.SetAccessRuleProtection($True, $False)
      
          $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
          $acl.AddAccessRule($rule)
      
          $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
          $acl.AddAccessRule($rule)
      
          $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$domain\Domain Admins","Read", "ContainerInherit, ObjectInherit", "None", "Allow")
          $acl.AddAccessRule($rule)
      
          $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($domainusername,"Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
          $acl.AddAccessRule($rule)
      
          Set-Acl $folder\$username $acl
      }
      

      注意:您必须在 csv 文件中创建相同的域用户名,否则您会遇到权限问题

      【讨论】:

        【解决方案12】:
        attrib +r +a +s +h <folder name> <file name> to hide
        attrib -r -a -s -h <folder name> <file name> to unhide
        

        【讨论】:

        • 这些是文件的属性(只读、存档、系统、隐藏)而不是权限,它们与用户帐户相关联。
        【解决方案13】:

        Călin Darie 的优点

        我有很多脚本要使用 cacls 我将它们移到 icacls 我怎么找不到脚本来更改根挂载卷示例:d:\datafolder。我终于创建了下面的脚本,它将卷安装为临时驱动器,然后应用 sec.然后卸载它。这是我发现可以更新根挂载安全性的唯一方法。

        1 将文件夹挂载 GUID 获取到临时文件,然后读取 GUID 以将卷挂载为临时驱动器 X:应用 sec 并记录更改,然后仅从 X:驱动器卸载卷,因此挂载的文件夹不会被更改或在应用秒之外被打断。

        这是我的脚本示例:

        **mountvol "d:\%1" /L >tempDrive.temp && FOR /f "tokens=*" %%I IN (tempDrive.temp) DO mountvol X: %%I 
        D:\tools\security\icacls.exe  %~2 /grant domain\group:(OI)(CI)F /T /C >>%~1LUNsec-%TDWEEK%-%TMONTH%-%TDAY%-%TYEAR%-%THOUR%-%TMINUTE%-%TAM%.txt
        if exist x:\*.* mountvol X: /d**
        

        【讨论】:

          【解决方案14】:

          我是管理员,一些脚本在我的名字上对目录中的所有文件和子文件夹设置了“拒绝”权限。执行icacls "D:\test" /grant John:(OI)(CI)F /T 命令不起作用,因为它似乎没有从这个列表中删除我名字中的“拒绝”。

          唯一对我有用的是使用icacls "D:\test" /reset /T 命令重置所有权限。

          【讨论】:

          • 可以在不使用重置命令的情况下解决该问题,方法是指定 ''/remove:d'' 删除可能存在的任何显式 DENY 设置 - 请参阅我的完美解决方案(上图)。
          【解决方案15】:
          1. 使用资源管理器导航到要设置权限的顶级目录
          2. 在资源管理器窗口的地址栏中输入 cmd
          3. 输入icacls . /grant John:(OI)(CI)F /T,其中 John 是用户名
          4. 利润

          添加这个是因为它看起来非常简单,其他人可能会获利 - 所有功劳归于Călin Darie

          【讨论】:

            【解决方案16】:

            在没有“c:>”和“>”的情况下工作的 Windows 10

            例如:

            F = Full Control
            /e : Edit permission and kept old permission
            /p : Set new permission
            

            cacls "文件或文件夹路径" /e /p 用户名:F

            (这也修复了错误 2502 和 2503)

            cacls "C:\Windows\Temp" /e /p 用户名:F

            【讨论】:

              【解决方案17】:

              这对我有用:

              1. 手动打开拒绝访问的文件夹。

              2. 选择该文件夹中的可执行文件/应用程序文件。

              3. 右键单击它并转到 Properties -> Compatibility

              4. 现在查看 Privilege Level 并检查 Run As Administrator

              5. 点击更改所有用户的设置

              问题已经解决了。

              【讨论】:

              • 问题是通过命令行执行上述操作。虽然您的建议可能效果很好,但如果您只有终端访问 (ssh) 到需要设置的服务器,则它不适用,因此您需要使用 cmd 脚本
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-12
              • 2016-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多