通过 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。使用它告诉我问题出在哪里。
我有一个 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。使用它告诉我问题出在哪里。