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 设置文件夹权限的主要内容,如果未能解决你的问题,请参考以下文章