-1

我有一个 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 -verify 未显示错误,并且未修改 ACL 以添加用户对象。

4

2 回答 2

0

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

接下来我建议使用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
于 2021-01-30T13:58:13.123 回答
0

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

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

于 2021-02-22T16:53:56.723 回答