如何通过网络等待权限被拒绝类型错误
How to wait for permission denied type erros over the network
在脚本中,我使用 Get-ChildItem -File -Recurse
来检查我对子文件夹的权限。然后,我尝试读取每个文件的第一个字符。我的目标是使用 $Error 捕获 Permission Denied 类型错误。它在当地运作良好。但是,当我在具有 UNC 长路径的远程服务器上执行脚本时,不会生成错误。如果我 运行 在脚本执行后手动 Get-ChildItem
命令,这应该会产生一些错误,它会显示文件但不会产生错误。如果我等几分钟再 运行 它,我最终会显示错误。
有没有办法等待错误生成?
这是我的代码的特定部分,它不会在网络上产生任何错误:
# Check if the current item is a folder or a file
If($elem.Attributes -eq 'Directory')
{
# Get all child items of File type
$subElem = Get-ChildItem -LiteralPath $elem.FullName -File -Recurse -ErrorAction SilentlyContinue
# Parse subfolders and files to check permissions integrity. To generate an Permission Denied error, a file must be open
ForEach($subItem in $subElem)
{
# Read the first character of the current sub-item
Get-Content -LiteralPath $subItem.FullName -Encoding byte -TotalCount 1 -ErrorAction SilentlyContinue | Out-Null
}
}
Else
{
# Read the first character of the current element
Get-Content -LiteralPath $elem.FullName -Encoding byte -TotalCount 1 -ErrorAction SilentlyContinue | Out-Null
}
我终于自己找到了解决办法。
在此脚本中,我使用模块 NTFSSecurity (https://github.com/raandree/NTFSSecurity) 来管理 ACL 和继承。通过网络,好像有点慢。
在我上面分享的代码之前,我有几行代码通过网络检查和更新一堆 ACL。因为这需要一些时间,所以错误只会在一段时间后产生。在这种情况下,如果命令遇到错误,它只会继续但不会同时显示或捕获错误。
我使用错误来检测我必须恢复访问权限的项目。现在,我使用 NTFSSecurity 模块附带的另一个 cmdlet,Get-NTFSEffectiveAccess。
我写了一个完美的小函数:
Function Check-MyAccess([String]$Path)
{
# Get effective permissions
$effectiveAccess = Get-NTFSEffectiveAccess -Path $Path -ErrorAction SilentlyContinue
# Check to be, at least, able to read the item
If(($effectiveAccess -eq $Null) -or ($effectiveAccess.AccessRights -Match 'Synchronize') -or ((($effectiveAccess.AccessRights -Like '*Read*') -or ($effectiveAccess.AccessRights -Like '*Modify*') -and ($effectiveAccess.AccessControlType -Match 'Deny'))))
{
Return $False
}
Else
{
Return $True
}
}
在脚本中,我使用 Get-ChildItem -File -Recurse
来检查我对子文件夹的权限。然后,我尝试读取每个文件的第一个字符。我的目标是使用 $Error 捕获 Permission Denied 类型错误。它在当地运作良好。但是,当我在具有 UNC 长路径的远程服务器上执行脚本时,不会生成错误。如果我 运行 在脚本执行后手动 Get-ChildItem
命令,这应该会产生一些错误,它会显示文件但不会产生错误。如果我等几分钟再 运行 它,我最终会显示错误。
有没有办法等待错误生成?
这是我的代码的特定部分,它不会在网络上产生任何错误:
# Check if the current item is a folder or a file
If($elem.Attributes -eq 'Directory')
{
# Get all child items of File type
$subElem = Get-ChildItem -LiteralPath $elem.FullName -File -Recurse -ErrorAction SilentlyContinue
# Parse subfolders and files to check permissions integrity. To generate an Permission Denied error, a file must be open
ForEach($subItem in $subElem)
{
# Read the first character of the current sub-item
Get-Content -LiteralPath $subItem.FullName -Encoding byte -TotalCount 1 -ErrorAction SilentlyContinue | Out-Null
}
}
Else
{
# Read the first character of the current element
Get-Content -LiteralPath $elem.FullName -Encoding byte -TotalCount 1 -ErrorAction SilentlyContinue | Out-Null
}
我终于自己找到了解决办法。 在此脚本中,我使用模块 NTFSSecurity (https://github.com/raandree/NTFSSecurity) 来管理 ACL 和继承。通过网络,好像有点慢。
在我上面分享的代码之前,我有几行代码通过网络检查和更新一堆 ACL。因为这需要一些时间,所以错误只会在一段时间后产生。在这种情况下,如果命令遇到错误,它只会继续但不会同时显示或捕获错误。
我使用错误来检测我必须恢复访问权限的项目。现在,我使用 NTFSSecurity 模块附带的另一个 cmdlet,Get-NTFSEffectiveAccess。 我写了一个完美的小函数:
Function Check-MyAccess([String]$Path)
{
# Get effective permissions
$effectiveAccess = Get-NTFSEffectiveAccess -Path $Path -ErrorAction SilentlyContinue
# Check to be, at least, able to read the item
If(($effectiveAccess -eq $Null) -or ($effectiveAccess.AccessRights -Match 'Synchronize') -or ((($effectiveAccess.AccessRights -Like '*Read*') -or ($effectiveAccess.AccessRights -Like '*Modify*') -and ($effectiveAccess.AccessControlType -Match 'Deny'))))
{
Return $False
}
Else
{
Return $True
}
}