使用PowerShell Set-Acl应用ACL权限

8
New-Item -Type Directory -Path "C:\MyFolder"
$Acl = Get-Acl "C:\MyFolder"
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("username", "FullControl", "Allow")
$Acl.SetAccessRule($Ar)
Set-Acl -Path "C:\MyFolder" -AclObject $Acl

嗨,当我使用自己的设置应用上述代码时,用户帐户条目被添加到文件夹中,但没有应用权限(没有勾选)。

有人可以帮忙解释可能的原因吗?

谢谢


你的代码片段对我有效。你有任何错误信息吗?是UnauthorizedAccessException吗? - Clijsters
没有错误 - 帐户已添加到文件夹中的安全权限中 - 您可以在那里看到它们,但没有勾选的权限。我实际运行的唯一区别是我引用存储在用户帐户中的变量 - 但这是有效的 - 否则,该帐户不会显示在其中。 - Royston
很难理解你的问题。希望我理解了你的意思。请考虑重新审查一下问题,并添加一些附加信息和屏幕截图,以便其他人能够理解你的意思。(我个人认为这个问题更适合在superuser上发布) - Clijsters
如果我的回答解决了你的问题,请将其标记为已接受的答案。谢谢! - Clijsters
2个回答

5

您的评论描述了以下行为:

您的PowerShell脚本成功执行,但如果您使用资源管理器属性对话框检查权限,您将看到以下内容:

permissions with unfilled checkboxes

这相当令人困惑,因为PowerShell查询将予以确认:

PS> Get-Acl .|fl


Path   : Microsoft.PowerShell.Core\FileSystem::D:\temp\myfolder
Owner  : clijsters\clijsters
Group  : clijsters\Kein
Access : clijsters\NEWUSER Allow  FullControl
        VORDEFINIERT\Administratoren Allow  FullControl
        VORDEFINIERT\Administratoren Allow  268435456
        NT-AUTORITÄT\SYSTEM Allow  FullControl
        [...]

你的ACL已更改。如果你向下滚动复选框列表,你会注意到"特殊权限"被选中,如果你点击"高级",你会注意到你的权限已设置。
编辑:
如@AnsgarWiechers所述,我错过了一个描述为什么使用New-Object System.Security.AccessControl.FileSystemAccessRule("username", "FullControl", "Allow")添加的权限被列为"特殊权限"的部分。
如MSDN所述,FileSystemAccessRule有4个构造函数,其中一些接受InheritanceFlagsPropagationFlags(例如这个适合你的需求)。如果你使用它们并定义继承行为,则权限将显示为普通权限。

谢谢!这是一种非常酷的方式,将文件夹权限作为更广泛的脚本解决方案的一部分添加进去。 - Royston
2
"特殊权限"显示的原因是您没有定义继承,因此权限仅适用于“仅此文件夹”。将容器和对象继承添加到ACE中,权限将显示为“常规”完全控制。 - Ansgar Wiechers
1
我不明白为什么这个答案被标记为“未采纳”。我刚巧在我的个人资料上看到了它。@Royston:您能解释一下,让我知道如何改进我的答案吗? - Clijsters
@Clijsters 现在被分类为一个答案。谢谢。 - Royston

3
今天我在尝试编译ILSpy时遇到了AL1078:签名程序集错误,这是一个权限问题。下面是一些答案的综合。

这个powershell脚本将$CurUsr赋值给当前登录用户的令牌,将$CurTgt作为正在修改权限的文件夹。根据需要更改它们。

添加权限:

$CurTgt = "C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys"
$CurUsr = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$acl = Get-Acl $CurTgt
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($CurUsr,"FullControl","ContainerInherit,ObjectInherit","None","Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl $CurTgt

取消权限:

$CurTgt = "C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys"
$CurUsr = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$acl = Get-Acl $CurTgt
$usersid = New-Object System.Security.Principal.Ntaccount ($CurUsr)
$acl.PurgeAccessRules($usersid)
$acl | Set-Acl $CurTgt

参考资料:

使用PowerShell脚本管理文件系统访问控制列表(ACL) 继承 当前用户


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