Мне нужна помощь в понимании проблем безопасности 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
на строковом объекте вместо элементов вашей папки.