Как дождаться ошибок типа отказано в разрешении по сети - PullRequest
0 голосов
/ 06 августа 2020

В сценарии я использую Get-ChildItem -File -Recurse, чтобы проверить свои права доступа к подпапкам. Затем я пытаюсь прочитать первый символ каждого файла. Моя цель - отловить ошибки типа Permission Denied с помощью $ Error. Хорошо работает локально. Но когда я выполняю сценарий на удаленном сервере с длинным путем UN C, ошибок не возникает. Если я запускаю вручную команду Get-ChildItem сразу после выполнения скрипта, который должен генерировать некоторые ошибки, он отображает файлы, но не генерирует ошибок. Если я подожду несколько минут и снова запущу его, я наконец получу сообщение об ошибке. Есть ли способ подождать появления ошибок?

Вот конкретная c часть моего кода, которая не генерирует никаких ошибок по сети:

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

1 Ответ

0 голосов
/ 10 августа 2020

Я наконец нашел решение сам. В этом скрипте я использую модуль NTFSSecurity (https://github.com/raandree/NTFSSecurity) для управления списками ACL и наследованием. По сети это кажется немного медленным.

Перед фрагментом кода, который я поделился выше, у меня есть несколько строк, которые проверяют и обновляют кучу ACL по сети. Поскольку это занимает некоторое время, ошибки возникают только через некоторое время. В этом случае, если команда обнаруживает ошибку, она просто продолжается, но не отображает и не перехватывает ошибку одновременно.

Я использовал ошибки для обнаружения элементов, к которым мне пришлось восстановить доступ. Теперь я использую другой командлет, поставляемый с модулем NTFSSecurity, 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
    }
}
...