【发布时间】:2011-02-25 02:29:32
【问题描述】:
如何使用 Windows 命令行向用户授予对目录的权限(读取、写入、修改)?
【问题讨论】:
-
我们以特定用户帐户运行 apache 服务,这是否允许 apache 以完全权限访问文档根目录?
标签: windows command-prompt file-permissions
如何使用 Windows 命令行向用户授予对目录的权限(读取、写入、修改)?
【问题讨论】:
标签: windows command-prompt file-permissions
从 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 = 递归应用到现有文件和子文件夹。 (OI 和 CI 仅适用于新文件和子文件夹)。信用:@AlexSpence 的评论。【讨论】:
C:\>icacls "D:\test" /grant "John:(OI)(CI)F" /T
您也可以使用 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
打开命令提示符,然后执行以下命令:
icacls "c:\somelocation\of\path" /q /c /t /grant Users:F
F 提供完全访问权限。
/q /c /t 将权限应用于子文件夹。
注意:有时“以管理员身份运行”会有所帮助。
【讨论】:
使用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 /?
【讨论】:
cacls 是相关的;它仍然在Windows 10 中可用; Microsoft 也会弃用 cmd.exe 以支持 Powershell。
cmd.exe 没有被弃用,也不太可能被弃用,所以这根本不是支持icacls 的重点,恰恰相反。
cacls.exe 是否是个好主意。我也没有提到 cmd.exe 已被弃用。我认为人们至少应该意识到它在更高版本中的可用性,即使只是为了向后兼容或任何其他原因。
我尝试了以下方法,它对我有用:
1.打开cmd.exe
2.takeown /R /F *.*
3.icacls * /T /grant [username]:(D)
4.del *.* /S /Q
这样文件就可以成为我自己的访问权限并分配给“删除”,然后我可以删除文件和文件夹。
【讨论】:
损坏的权限:重新获得对文件夹及其子对象的访问权限
尽管针对该问题发布的大多数答案都有一些优点,但恕我直言,它们都没有给出完整的解决方案。如果您因权限设置损坏而无法访问文件夹,则以下(可能是)适合 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
.
备注:
命令应用于指定目录。
指定用户“Everyone”会设置尽可能广泛的权限,因为它包括每个可能的用户。
选项“/remove:d”会删除任何可能存在的显式 DENY 设置,因为这些设置会覆盖显式 ALLOW 设置:这是创建新 ALLOW 设置的必要前提。 这只是一种预防措施,因为通常没有 DENY 设置,但总比抱歉更安全。
选项“/grant”创建一个新的 ALLOW 设置,一个显式权限替换 (“:r”) 任何和所有可能存在的显式 ALLOW 设置。
“F”参数(即创建的权限)使其成为完全控制的授予。
“/T”参数添加递归,将这些更改应用于指定目录(即文件和子文件夹)中的所有当前子对象,以及文件夹本身。
“(OI)”和“(CI)”参数还添加了递归,将这些更改应用于随后创建的子对象。
.
附录 (2019/02/10) -
今天有人向我推荐了 Windows 10 命令行上面,所以就在这里。我还没有 Windows 10 来测试它,但如果你有,请尝试一下(然后请你在下面发表评论)。
更改仅涉及作为第一步删除拒绝设置。很可能不存在任何 DENY 设置,因此该选项可能没有任何区别。我的理解是,在 Windows 7 上,您不需要在 /remove:d 之后指定用户,但我可能错了!
。
附录(2019 年 11 月 21 日) -
用户 astar 建议将 Everyone 替换为 *S-1-1-0,以使命令与语言无关。我只有英文版的 Windows,所以我无法测试这个提议,但它似乎是合理的。
【讨论】:
Invalid parameter "/remove:d"
我为此苦苦挣扎了一段时间,只有结合这个线程中的答案对我有用(在 Windows 10 上):
1. 打开 cmd 或 PowerShell 并进入包含文件的文件夹
2. takeown /R /F .
3. icacls * /T /grant dan:F
祝你好运!
【讨论】:
使用 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 - 遍历所有子文件夹以匹配文件/目录。
这给了我这个服务器上的一个文件夹,用户只能看到该文件夹并创建子文件夹,他们可以读取和写入文件。以及创建新文件夹。
【讨论】:
以防万一其他人在此页面上绊倒,如果您想在一个命令中将各种权限串在一起,我使用了这个:
icacls "c:\TestFolder" /grant:r Test_User:(OI)(CI)(RC,RD,RX)
注意各种权限的 csv 字符串。
【讨论】:
XCACLS.VBS 是一个非常强大的脚本,可以更改/编辑 ACL 信息。 c:\windows\system32\cscript.exe xcacls.vbs help 返回所有开关和选项。
您可以从Microsoft Support Page获得官方分发
【讨论】:
XCACLS.VBS 的参考吗?
使用以下 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 文件中创建相同的域用户名,否则您会遇到权限问题
【讨论】:
attrib +r +a +s +h <folder name> <file name> to hide
attrib -r -a -s -h <folder name> <file name> to unhide
【讨论】:
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**
【讨论】:
我是管理员,一些脚本在我的名字上对目录中的所有文件和子文件夹设置了“拒绝”权限。执行icacls "D:\test" /grant John:(OI)(CI)F /T 命令不起作用,因为它似乎没有从这个列表中删除我名字中的“拒绝”。
唯一对我有用的是使用icacls "D:\test" /reset /T 命令重置所有权限。
【讨论】:
icacls . /grant John:(OI)(CI)F /T,其中 John 是用户名添加这个是因为它看起来非常简单,其他人可能会获利 - 所有功劳归于Călin Darie。
【讨论】:
在没有“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
【讨论】:
这对我有用:
手动打开拒绝访问的文件夹。
选择该文件夹中的可执行文件/应用程序文件。
右键单击它并转到 Properties -> Compatibility
现在查看 Privilege Level 并检查 Run As Administrator
点击更改所有用户的设置。
问题已经解决了。
【讨论】: