PowerShell 设置文件夹权限

Posted

技术标签:

【中文标题】PowerShell 设置文件夹权限【英文标题】:PowerShell To Set Folder Permissions 【发布时间】:2014-11-04 22:17:45 【问题描述】:

我正在尝试使用“默认”选项来应用文件夹权限;我的意思是在文件夹的“属性”中使用“完全控制、写入、读取等”。

以下脚本用于添加用户,但它应用“特殊权限” - 而不是那些在文件夹的属性菜单中可见的带有复选框的用户:

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule ("user","FullControl","Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

请问我做错了什么?

【问题讨论】:

【参考方案1】:

FileSystemAccessRule() 构造函数中指定继承可以解决这个问题,如下面的修改代码所示(注意插入在"FullControl""Allow" 之间的两个新构造函数参数)。

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("user", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

根据this topic

"当您以您的方式创建 FileSystemAccessRule 时, InheritanceFlags 属性设置为无。在 GUI 中,这 对应于应用到框设置为“仅此文件夹”的 ACE, 并且该类型的条目必须通过高级查看 设置。”

我已经测试了修改并且它有效,但当然功劳是由于 MVP 在该主题中发布了答案。

【讨论】:

【参考方案2】:

参考Gamaliel 's answer:$args 是在运行时传递给脚本的参数数组——因此不能像 Gamaliel 那样使用它。 这实际上是有效的:

$myPath = 'C:\whatever.file'
# get actual Acl entry
$myAcl = Get-Acl "$myPath"
$myAclEntry = "Domain\User","FullControl","Allow"
$myAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($myAclEntry)
# prepare new Acl
$myAcl.SetAccessRule($myAccessRule)
$myAcl | Set-Acl "$MyPath"
# check if added entry present
Get-Acl "$myPath" | fl

【讨论】:

【参考方案3】:

另一个使用 PowerShell 设置权限(文件/目录)的示例:

验证权限

Get-Acl "C:\file.txt" | fl *

为所有人应用完全权限

$acl = Get-Acl "C:\file.txt"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("everyone","FullControl","Allow")
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "C:\file.txt"

截图:

希望对你有帮助

【讨论】:

这似乎不起作用 - 它最终为用户设置了“特殊权限”,而不是完全控制。 感谢您的 cmets,我只想分享另一个示例,该示例可以适应设置有用的权限并且对我有用。 有趣,我想知道为什么它对我不起作用——也许我做错了! accessRule 行返回:找不到构造函数 这是一组参数:blog.netwrix.com/2018/04/18/…【参考方案4】:

如果您必须处理包含子文件夹和其他递归内容的大量子文件夹。 @Mike L'Angelo的小改进:

$mypath = "path_to_folder"
$myacl = Get-Acl $mypath
$myaclentry = "username","FullControl","Allow"
$myacces-s-rule = New-Object System.Security.AccessControl.FileSystemAccessRule($myaclentry)
$myacl.SetAccessRule($myacces-s-rule)
Get-ChildItem -Path "$mypath" -Recurse -Force | Set-Acl -AclObject $myacl -Verbose

最后一行的详细程度是可选的

【讨论】:

谢谢。正是我需要的。不过警告,它可能需要很长时间才能运行。【参考方案5】:
$path = "C:\DemoFolder"
$acl = Get-Acl $path
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Attribs = $username, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
$AccessRule = New-Object System.Security.AcessControl.FileSystemAccessRule($Attribs)
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl $path
Get-ChildItem -Path "$path" -Recourse -Force | Set-Acl -aclObject $acl -Verbose

【讨论】:

以上是关于PowerShell 设置文件夹权限的主要内容,如果未能解决你的问题,请参考以下文章

使用PowerShell为大量文件设置文件权限

powershell遍历文件夹设置权限,解决文件无法删除的问题。

Powershell - 新用户主文件夹权限

如何通过powershell将用户权限分配给本地用户帐户?

PowerShell 修复 Robocopy的权限问题

PowerShell 文件夹权限错误 - 部分或全部身份引用无法翻译