Мне нужна помощь в понимании проблем безопасности PowerShell и доступа к файлам

Я работаю с PowerShell, запускаю скрипт (из моей консоли), который включает в себя следующую строку:

$inpath = "C:\users\xxxxx\path\foo\bar"

и я продолжаю получать эту ошибку:

Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied.
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12
+ Get-Content <<<<  $txtfile | Get-WordCount -Exclude (Get-Content c:\temp\exclude.txt) | select -First 15
    + CategoryInfo          : PermissionDenied: (C:\users\xxxxx\path\foo\bar:String) [Get-Content], UnauthorizedAcc
   essException
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

Сценарии и целевые файлы находятся на моем локальном диске. Я могу получить доступ к файлам в Проводнике, просматривать / редактировать / сохранять их с помощью Блокнота и не устанавливать никаких ограничений разрешений. Когда я в командной строке, я могу запустить get-content Командлет успешно на файлы в моем пути. Я могу поменять каталоги PS C:> cd C:\users\xxxxx\path\foo\bar и успешно перечислить, что там. Еще интереснее то, что я могу продублировать строку, в которой происходит ошибка в скрипте, и НЕ получить ошибку в командной строке.

PS C:\users\xxxxx\path\foo> $inpath = "C:\users\xxxxx\path\foo\bar"
PS C:\users\xxxxx\path\foo>

Это заставляет меня подозревать, что ошибка "Отказано в доступе" на самом деле является чем-то другим или достаточно неопределенным, и я не имею ни малейшего понятия, как продолжить устранение неполадок. Возможно ли для PS иметь другие разрешения, чем у пользователя, под которым он работает? Кто-нибудь видел такое поведение раньше, и как вы решили проблему? Я уверен, что есть простое решение, которое я не знаю.

3 ответа

Решение
Get-Content: Доступ к пути "C:\users\xxxxx\path\foo\bar" запрещен.
В C:\users\xxxxx\path\foo\testscript.ps1:53 char:12

Этот путь выглядит не как файл, а как папка.

Вы уверены, что добавляете имя файла в папку и передаете его Get-Content?

Windows выдает Access Denied, когда вы пытаетесь открыть каталог, как если бы он был файлом без дополнительных флагов; и.NET не передает эти флаги (есть несколько особых обстоятельств для открытия папки, но они здесь не применяются).

Get-Content читает содержимое файла, а не папки. Пожалуйста, добавьте . после вашего пути к папке, как показано ниже.

Get-Content "D:\Logs\*.*" | ?{($_|Select-String "test")}

Если вы хотите просмотреть все папки под ним, то добавьте -recurse, как показано ниже:

Get-Content "D:\Logs\*.*" -Recurse | ?{($_|Select-String "test")}

Вместо этого: (согласно вашему комментарию)

foreach ($doc in $inpath) { do-function }

попробуй это:

foreach ($doc in (gci $inpath)) { do-function }

Вы делаете foreach на строковом объекте вместо элементов вашей папки.

Другие вопросы по тегам