通过 P/S 设置 NTFS 权限并出现 Canonical Form 错误

Setting NTFS rights via P/S and getting Canonical Form error

我有一个 PowerShell 脚本来使用 NTFS、共享和 DFS 设置用户的文件夹。所有这些都有效,但是我在设置 NTFS 权限时收到此消息。

使用“1”个参数调用“SetAccessRule”时出现异常:“此访问控制列表不是规范形式,因此无法修改。” 在 C:\Users\Public\Documents\Scripts\Add-UserFolders.ps1:53 char:1

代码如下所示:

# NTFS Rights
$Acl = (Get-Item $UserFolder).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($Username, 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
$Acl.SetAccessRule($Ar)
Set-Acl -path $UserFolder -AclObject $Acl

$Acl = (Get-Item $ScanFolder).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($Username, 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
$Acl.SetAccessRule($Ar)
Set-Acl -path $ScanFolder -AclObject $Acl

我的问题是第一个代码块抛出错误,但第二个代码块没有抛出错误,即使格式相同。 运行 icacls Path\to\folder - 验证显示没有错误并且未修改 ACL 以添加用户对象。

这个错误可能意味着 ACL 的顺序不正确,要修复它,您可以使用我的功能

接下来我建议使用 Get-Acl

尝试:

# create the new access rule
# see: https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontrol.filesystemaccessrule
$rule = [System.Security.AccessControl.FileSystemAccessRule]::new($Username, 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')

$Acl = Get-Acl -LiteralPath $UserFolder
$Acl.SetAccessRule($rule)
$Acl | Set-Acl -LiteralPath $UserFolder

$Acl = Get-Acl -LiteralPath $ScanFolder
$Acl.SetAccessRule($rule)
$Acl | Set-Acl -LiteralPath $ScanFolder

Get-Acl 是正确的方法,但我没有使用上面显示的脚本。通过 运行 get-acl ,我注意到一个对象出现在错误的位置。查看该对象,我确定不需要它并将其从 acl 中删除,现在一切正常。

规范顺序的一个很好的解释是 here。使用它告诉我问题出在哪里。