如何通过网络等待权限被拒绝类型错误

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
    }
}