使用PowerShell设置文件夹权限

68

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

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

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

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

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

请问我做错了什么?

6个回答

124
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

根据这个主题,当您创建一个FileSystemAccessRule时,继承标志(InheritanceFlags)属性被设置为None。在GUI中,这对应于一个ACE,其“应用于”框设置为“This Folder Only”,而这种类型的条目必须通过高级设置查看。

我已经测试了修改并且它有效,但当然要归功于在那个主题中发布答案的MVP。


10

关于Gamaliel的回答$args是一个Powershell自动变量,它包含了在运行时传递给脚本、脚本块或函数的未声明参数的值数组 - 因此不能像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

7

以下是使用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"

屏幕截图: 在此输入图片描述 在此输入图片描述 希望这可以帮助到您。

2
这似乎不起作用 - 最终设置了用户的“特殊权限”,而不是完全控制权限。 - Mark Hughes
谢谢您的评论,我想分享另一个例子,它可以适应设置权限,这对我很有用。 - Gamaliel
有趣,我想知道为什么它对我不起作用 - 也许是我做错了! - Mark Hughes
accessRule行返回:未找到构造函数。 - Bub Espinja
抱歉大家,我只是想纠正我的错误。 - Gamaliel
1
这是一组参数:https://blog.netwrix.com/2018/04/18/how-to-manage-file-system-acls-with-powershell-scripts/ - mggluscevic

6

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

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

在最后一行,冗长的陈述是可选的


2

这个对我起作用了。

$path = "C:\test"
$name = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$acl = Get-Acl "C:\test"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($name,"FullControl","Allow")
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "C:\test"
Get-ChildItem -Path "$path" -Recurse -Force | Set-Acl -aclObject $acl -Verbose

这对我非常有效,而其他方法则不行。问题实际上出在$accessRule设置上。我也很感激这个方法因为它保留了已登录用户的访问权限,这正是我想要的限制方式。 - tlbignerd

-2
$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

仅因此处存在拼写错误且编辑队列已满而进行贬低评分是不合适的。最后一行应为Get-ChildItem -Path "$path" -Recurse -Force | Set-Acl -aclObject $acl -Verbose - tlbignerd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接