Получить путь к файлу или каталогу, который вызвал UnauthorizedAccessException при использовании Get-Acl - PullRequest
0 голосов
/ 22 октября 2018

Я использую команду Powershell $TargetFiles = Get-Childitem $TargetPath -Recurse -ErrorAction Stop | Get-Acl.

Если эта команда не выполнена из-за того, что ее пользователь не имеет прав доступа к какому-либо файлу или каталогу, возникает следующая ошибка:

Get-Acl : Attempted to perform an unauthorized operation.
At B:\PS\Script.ps1:20 char:50
+     $TargetFiles = Get-Childitem $TargetPath -Recurse -ErrorAction Stop <<<<
    + CategoryInfo          : NotSpecified: (:) [Get-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetAclCommand

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

Как получить путь к файлу или каталогу, вызвавшему эту ошибку?

У меня естьпопытался использовать команды, такие как Get-PSCallStack, и посмотрел на переменные, такие как $StackTrace, но не смог найти эту информацию из них.

Версия Powershell, которую я использую:

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

ОС - Windows7.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

К сожалению, кажется, Get-Acl - это код, вызывающий исключение, и хотя это тот же тип исключения, который мы увидим, возвращаемый Get-ChildItem, сообщение отличается (Attempted to perform an unauthorized operation вместо Access to the path 'c:\whatever' is denied),и в его данных нет несоответствующего пути.

Исправление таково:

try {
    $TargetFiles = $TargetPath | Get-Childitem -Recurse -ErrorAction Stop | ForEach-Object{$_ | Get-Acl -ErrorAction Stop}
} catch [System.UnauthorizedAccessException] {
    $pathWithProblem = $_.TargetObject
    #do what you like with it after this
    $descriptionOfProblem = $_.Exception.Message
    Write-Warning "$descriptionOfProblem : $pathWithProblem"
    throw
}

Это выглядит немного глупо;поскольку мы просто упаковываем вызов в Get-ACL в блоке foreach;логика которого в любом случае решается с помощью конвейерного ввода.Я почти уверен, что это необычное поведение вызвано ошибкой в ​​логике PS для генерации информации об исключениях, но эта оболочка, кажется, действительно работает вокруг вашей проблемы.

0 голосов
/ 22 октября 2018

Вы можете использовать автоматическую переменную $Error, чтобы просмотреть процесс, вызвавший исключение.Вот так:

$TargetFiles = Get-Childitem $TargetPath -Recurse -ErrorAction Stop

$Error[0]
$Error[0].ErrorRecord.CategoryInfo
$Error[0].ErrorRecord.CategoryInfo.TargetName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...