Отказано в доступе к Windows powershell

Обновлено: 01.07.2024

Как описано в этой ветке Reddit, Get-ChildItem может ничего не возвращать при возникновении ошибки "Отказано в доступе" ( System.UnauthorizedAccessException ), несмотря на -ErrorAction Ignore . Я обнаружил, что это происходит в некоторых системах при сканировании всего диска из корневого каталога.

Решение, предложенное OPconfused , то есть создание списка файлов вручную, сработало в моем случае. Ошибка «Отказано в доступе» по-прежнему отображается, но скрипт продолжает проверку найденных файлов.

Текст был успешно обновлен, но возникли следующие ошибки:

no-identd прокомментировал 18 декабря 2021 г.

@wdormann Вы явно (запретить) или неявно (без соответствия) спровоцировали сообщение об отказе в доступе, и вы сделали это на уровне файла или папки?

wdormann прокомментировал 18 декабря 2021 г.

Приведенный выше снимок экрана является результатом двух операций с файловой системой:

  1. Явно запретить доступ к файлу в подкаталоге.
  2. Явно запретить доступ к подкаталогу.
    Полагаю, мне нужно больше информации от ОП о том, что привело к возникшей проблеме и в чем заключалась проблема.

Munmun6392 прокомментировал 19 декабря 2021 г.

Здравствуйте, @wdormann. Я проверил синтаксис, есть проблема с синтаксисом. внесите изменения в синтаксис в соответствии со стандартным синтаксисом, это решит проблему.

jmbking прокомментировал 19 декабря 2021 г.

JndiLookup error


Я не получаю ошибок при запуске сценария в Powershell, но если я запускаю его в ISE, некоторые серверы завершают его без отображения зеленой кнопки воспроизведения по завершении.

Если я запускаю gci 'c:\' -rec -force -include *.jar -ea 0 | foreach | select -exp Path
возвращает прикрепленную ошибку о том, что доступ запрещен, но у меня есть доступ, и я предполагаю, что это связано с ограничением символов в пути к файлу.

wdormann прокомментировал 19 декабря 2021 г.

Я не могу утверждать, что знаю что-либо о PowerShell, но я зафиксировал непрямую обработку файлов, чтобы они выглядели как 7bab00c
Поскольку я действительно не знаю, что основная причина может заключаться в том, что мне придется положиться на любого, кто высказался здесь, чтобы узнать, изменилось ли что-нибудь.

прокомментировал bewell 20 декабря 2021 г. •

Capture


Я получаю эту ошибку при запуске скрипта. Я удаленно зашел на сервер.
Редактировать: я вошел в систему как администратор и запускаю PS от имени администратора.

wdormann прокомментировал 20 декабря 2021 г.

Важный вопрос:
Остановился ли сканер в момент обнаружения файла, или он просто сообщает вам, что обнаружил файл, который не может прочитать по пути?

прокомментировал bewell 20 декабря 2021 г.

Важный вопрос: остановился ли сканер в момент обнаружения файла или он просто сообщает вам, что по пути обнаружил файл, который не может прочитать?

Он остановился и вернулся с приглашением PS C:\tmp>.

wdormann прокомментировал 20 декабря 2021 г.

В качестве эксперимента попробуйте изменить "-ErrorAction Ignore" на "-ErrorAction SilentlyContinue" в скрипте ps1.

прокомментировал bewell 20 декабря 2021 г.

В качестве эксперимента попробуйте изменить "-ErrorAction Ignore" на "-ErrorAction SilentlyContinue" в скрипте ps1.

Та же ошибка, что и раньше. Без изменений.

JaapSchram прокомментировал 21 декабря 2021 г. •

Когда параметр Force удален, он работает, однако это НЕ цель. У кого-нибудь есть предложение? Это также ломает мое сканирование, как и @bewell.

Прокомментировал JaapSchram 21 декабря 2021 г.

Это показано (удален путь At):

Get-ChildItem: доступ запрещен

TecharyJames прокомментировал 21 декабря 2021 г.

Сценарий по-прежнему работает и обнаруживает экземпляры log4j, которые можно использовать для уязвимости. Это проверялось путем размещения jar-файла log4j в нескольких местах на диске C сервера и запуска сценария.

Я все еще вижу ошибку, но каждый раз, когда она сканирует, она по-прежнему обнаруживает уязвимый файл .jar.
Вы можете раскомментировать строку 55, чтобы увидеть сканирование всех файлов.

Если он возвращается к строке консоли без предупреждения, это означает, что скрипт не нашел никаких уязвимых файлов jar.

Прокомментировал JaapSchram 21 декабря 2021 г.

Возможно, это то, что вы заметили, Джеймс, но для меня это сбой на моей собственной машине с Windows 10 с отказом в доступе (при добавлении параметра -Force в Get-ChildItem).

TecharyJames прокомментировал 21 декабря 2021 г.

Вы раскомментировали строку 55? Вы можете увидеть, как он сканирует файлы.

Возможно, @wdormann стоит добавить строку в вывод, если уязвимые файлы log4j не найдены.

JaapSchram прокомментировал 21 декабря 2021 г. •

Да, я пытался, странно то, что он не выдает отказ в доступе, но останавливает сканирование после определенного момента, я знаю, что я добавил некоторые дополнительные журналы. И я могу сравнивать между сканированиями, когда параметр Force удален. Список файлов, которые он сканирует, намного длиннее без параметра force, тогда как должно быть наоборот.

wdormann прокомментировал 21 декабря 2021 г.

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

Прокомментировал JaapSchram 21 декабря 2021 г.

Да, я понимаю @wdormann, я читал это раньше. Также я сам написал скрипт для решения проблемы с log4net с помощью аналогичной команды, и это не останавливает:

$files = Get-Childitem –Путь C:\ -Recurse –Force -ErrorAction SilentlyContinue | where-object < $.Name -match 'log4net.dll' -and $.DirectoryName -like 'C:*' > | Select-Object -Property DirectoryName

Разницу я не понимаю.
Как лучше всего сделать видимой папку (свойства файловой системы), вызывающую эту проблему?

JaapSchram прокомментировал 21 декабря 2021 г. •

wdormann прокомментировал 21 декабря 2021 г.

Я полагаю, что преимущества использования -Force (не игнорировать скрытые файлы) не перевешивают риски (потенциальное неполное сканирование).
Если кто-то в этой теме по-прежнему сталкивается с проблемами после ее удаления, сообщите об этом сейчас.

jledoux1962 прокомментировал 21 декабря 2021 г.

Я попытался удалить -Force, но скрипт сканирует только дюжину файлов, прежде чем останавливается. Сканирование выполняется на диске C:\, на котором определенно находится более дюжины файлов. Это происходит на одной машине под управлением Windows Server 2012 R2. Есть предложения?

jsmartbnl прокомментировал 21 декабря 2021 г.

Я работаю над исправлением — есть вероятность того, что скрипт поглотит исключения, связанные с отказом в доступе

jsmartbnl прокомментировал 21 декабря 2021 г.

JaapSchram прокомментировал 21 декабря 2021 г. •

jsmartbnl прокомментировал 21 декабря 2021 г.

jsmartbnl прокомментировал 21 декабря 2021 г.

Дело в том, что содержимое System.IO.Compression.ZipFile уже заключено в блок try/catch. Таким образом, файл, не являющийся действительным zip, должен быть в порядке. Подозреваю, что происходит что-то неладное. Возможно, $ означает, что «файл» действительно является NTFS ADS?

Я думаю, что zip-файл — отвлекающий маневр. Исключение происходит где-то еще, надеюсь, оно было перехвачено $error.

jledoux1962 прокомментировал 21 декабря 2021 г.

Та же проблема, что и при использовании нового скрипта.

jsmartbnl прокомментировал 21 декабря 2021 г.

Та же проблема, что и при использовании нового скрипта.

Запустите с параметром -Verbose и посмотрите, что он вам сообщает при сканировании.

Прокомментировал JaapSchram 21 декабря 2021 г.

Вот так: Checkjndi.ps1 C:\ -verbose -force?

jsmartbnl прокомментировал 21 декабря 2021 г.

Например: Checkjndi.ps1 C:\ -verbose -force?

Должен выдать сообщение об удалении всех ошибок в сеансе, вызвать сценарий с подробным выводом, а затем отобразить последнюю зарегистрированную ошибку на консоли. Это даст вам лучший шанс выяснить, что не так со сценарием.

Прокомментировал JaapSchram 21 декабря 2021 г.

Я добавил последний код в свой сценарий исправления Intune, немного подправил его, добавил функцию ведения журнала, и, тем не менее, он работает без параметра force, но пока все в порядке. Спасибо за тяжелую работу, ребята!!

Прокомментировал JaapSchram 21 декабря 2021 г.

Прокомментировал JaapSchram 21 декабря 2021 г.

Еще один пример, но я думаю так же:

jsmartbnl прокомментировал 21 декабря 2021 г.

Прокомментировал JaapSchram 21 декабря 2021 г.

теперь куда-то попали, вывод ошибки другой:

JaapSchram прокомментировал 21 декабря 2021 г. •

C:\Document and Settings — это точка соединения, ярлык файловой системы для c:\users. Итак, позвольте мне объяснить, что я запускаю сценарий, как и всегда, в разделе «Уполномоченный NT\система», чтобы имитировать его работу через Intune (или SCCM). Из командной строки с повышенными привилегиями: psexec.exe -i -s %SystemRoot%\system32\cmd.exe.

Прокомментировал JaapSchram 21 декабря 2021 г.

Итак, как нам обойти эту проблему :-)

JaapSchram прокомментировал 21 декабря 2021 г. •

Для скрипта исправления Intune базовый код идеален, я просто добавляю это внизу:

попробуйте
if ($global:foundvulnerable -eq $false) Write-Log -Сообщение "Проблема не найдена, выйдите с кодом 0" -Информация о серьезности
выход 0
>
else Write-Log -Сообщение "Обнаружена проблема, выход с кодом 1" - Ошибка серьезности
выход 1
>

>
catch $errMsg = $_.Exception.Message
возврат $errMsg
выход 1
>

Простая функция регистрации:

функция Write-Log [CmdletBinding()]
param(
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$message,

endnil прокомментировал 22 декабря 2021 г.

Похоже, в нашем случае мешает антивирусное ПО (проблемы даже с 7bab00c). Когда он отключен, $f = get-childitem -path "c:\" -file -recurse -force -erroraction ignore -include "*.zip" не вызывает исключений, а $f содержит список совпадающих файлов. При включенном антивирусе тот же вызов вызывал UnauthorizedAccessException , а $f имел значение null. Однако, пару раз переключив антивирус, он начинал работать каждый раз! Это также происходит только на некоторых машинах.

Интересно, что удаление -include "*.zip" позволило завершить вызов без создания исключения, и был возвращен список файлов. Замена -include "*.zip" на -filter "*.zip" также сработала, хотя -filter более ограничен.

На данный момент лучшим решением для нас является ручная фильтрация с помощью чего-то вроде $f = get-childitem -path "c:\" -file -recurse -force -erroraction ignore | где < $_.fullname.endswith(".zip") >.

В этом вопросе SO говорится о проблемах с Get-ChildItem и точками повторной обработки. Сначала я пытался использовать Get-ChildItem -Force -Recurse -Attributes !Hidden, !System, !ReparsePoint, как было предложено во втором ответе, но это не решило проблему. Подход с использованием Get-WmiObject позволяет избежать исключения, но кажется значительно медленнее, чем Get-ChildItem .

Использование индекса поиска Windows может быть полезным, поскольку он возвращает результаты почти мгновенно, но по умолчанию поиск Windows включает только ограниченный набор путей. Во всяком случае, вот код, который я попробовал, основываясь на этой статье:

Надеюсь, что-то из этого поможет другим.

no-identd прокомментировал 22 декабря 2021 г. •

Создает ли GCI блокировки чтения перед попыткой чтения?

+Поскольку @JaapSchram сообщил, что это происходит даже при работе с NT-AUTHORITY\SYSTEM, это заставляет меня подозревать, что мы сталкиваемся с чем-то вроде нарушения контроля уровня целостности — есть только одна вещь более мощная, чем локальная система (также известная как NT-AUTHORITY\ SYSTEM) с точки зрения уровня целостности, и это TrustedInstaller. (однако, не вздумайте возиться с получением права собственности, чтобы обойти это.)

Кроме того, следует отметить, что такие папки, как C:\Documents and Settings\, не являются «обычными» соединениями NTFS. Подстройка совместимости UAC действует на эти папки iirc. (если бы это были простые соединения, вы могли бы просмотреть их в проводнике.) К сожалению, у меня очень мало времени, чтобы внести свой вклад в это, иначе я бы исследовал это более тщательно, так что это все из смутных воспоминаний много лет назад, и, возможно, искажено несколько вещей.

@ednil, можете ли вы подключить procmon к powershell, пока антивирус активен? (убедитесь, что у вашего пользователя действительно есть разрешения на отладку, многие корпоративные среды удаляют это разрешение из группы администраторов, из-за чего такие инструменты, как procmon, ведут себя странно, но не сообщают об ошибках.)

Прокомментировал JaapSchram 22 декабря 2021 г.

Вернёмся к сети, через минуту-другую проверим последнюю версию кода.

Прокомментировал JaapSchram 22 декабря 2021 г.

С NT-AUTHORITY\SYSTEM мне по-прежнему отказывают в доступе и, к сожалению, перестают работать.

И действительно, @no-identd, я согласен с вашим утверждением. Я проведу еще один тест и запущу скрипт из Intune с включенным принудительным параметром.

Начиная с Windows 10 версии 1607 (Creator's Update) и Windows Server 2016 дескриптор безопасности объекта групповой политики по умолчанию запрещает пользователям удаленный доступ к диспетчеру учетных записей безопасности (SAM) с учетными данными, не входящими в домен, и, следовательно, предотвращает удаленное изменение пульса и пароля, сделанное локальные учетные записи пользователей, прошедшие иную проверку подлинности. Затронутые секреты локальной учетной записи Windows будут возвращать сообщение «Отказано в доступе» при удаленном изменении пароля или пульса.

Сценарий устраняет эти ошибки «Отказано в доступе», изменяя дескриптор безопасности Remote SAM Access локальной групповой политики по умолчанию, чтобы разрешить всем локальным пользователям на указанном компьютере удаленный доступ к SAM после аутентификации. Этот сценарий требует повышенных разрешений PowerShell.

Решение проблемы


ОПИСАНИЕ СЦЕНАРИЯ POWERSHELL

Этот сценарий добавляет на компьютер локальную непривилегированную группу пользователей (имя пользовательской группы можно указать с помощью параметра -GroupName), добавляет в группу всех локальных пользователей, а затем добавляет эту группу в список «Доступ к сети: ограничение клиентов». разрешено совершать удаленные вызовы в локальную групповую политику SAM.Это позволит всем локальным пользователям в группе получить удаленный доступ к SAM после аутентификации, которая требуется для проверки пароля на секретный сервер и смены пароля.

SCRIPT ARGUMENT HELP
Чтобы получить полный текст справки, запустите
> Get-Help C:\Script\Win10-HbFix.ps1 -Examples

ПАРАМЕТР

Указывает компьютеры, на которых выполняется сценарий (через запятую). Если не указано, по умолчанию используется локальный компьютер.

ПАРАМЕТР

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

Примеры:
Администратор
TestDomain\AdminUser

ПАРАМЕТР

Указывает имя для локальной группы пользователей доступа к SAM. Если не указано, имя группы по умолчанию — «Удаленный доступ к секретному серверу SAM»

ПАРАМЕТР

Указывает, должно ли обновление групповой политики выполняться принудительно для немедленного действия после сценария. (В противном случае изменения групповой политики по умолчанию вступят в силу через 120 минут).


ПРИМЕР
> C:\Script\Win10-HbFix.ps1

В этом примере удаленный доступ к SAM предоставляется всем локальным пользователям на текущем компьютере. Текущие учетные данные PowerShell будут использоваться для аутентификации.

ПРИМЕР
> C:\Script\Win10-HbFix.ps1 -LogDir "D:\Win10-HbFix\log"

ПРИМЕР
> C:\Script\Win10-HbFix.ps1 -Имена компьютеров "WINSERVER","TestDomain\SOMEMACHINE" -Имя пользователя "TestDomain\Administrator"

В этом примере удаленный доступ SAM предоставляется всем локальным пользователям на удаленных компьютерах WINSERVER и TestDomain\SOMEMACHINE. Будут использоваться учетные данные пользователя домена «TestDomain\Administrator». Вам будет предложено ввести пароль.

ПРИМЕР
> C:\Script\Win10-HbFix.ps1 -ComputerNames "D:\Win10MachineList.txt" -Имя пользователя "TestDomain\Administrator"

В этом примере удаленный доступ к SAM предоставляется всем локальным пользователям на удаленных компьютерах, перечисленных в файле D:\Win10MachineList.txt (по одному компьютеру в строке). Будут использоваться учетные данные пользователя домена «TestDomain\Administrator». Вам будет предложено ввести пароль.

ПРИМЕР
> C:\Script\Win10-HbFix.ps1 -ComputerNames "WINSERVER" -GroupName "Secret Server Group"

В этом примере удаленный доступ к SAM предоставляется всем локальным пользователям на удаленном компьютере WINSERVER. Созданная локальная группа будет называться «Secret Server Group». Текущие учетные данные PowerShell будут использоваться для аутентификации.

ПРИМЕР
> C:\Script\Win10-HbFix.ps1 -ComputerNames "WINSERVER" -ForceGPUpdate -Verbose

В этом примере удаленный доступ к SAM предоставляется всем локальным пользователям на удаленном компьютере WINSERVER с подробным выводом. Текущие учетные данные PowerShell будут использоваться для аутентификации. Обновление групповой политики будет принудительно запущено на WINSERVER для немедленного вступления в силу.

Get-Appxpackage — это команда PowerShell, которая может отображать список пакетов приложений, установленных в профиле пользователя. Он включает в себя все приложения, установленные из Microsoft Store или сторонних приложений. Если при использовании команды вы получаете сообщение об ошибке Powershell Get-Appxpackage Access Denied, Not Recognized or Not Work, этот пост поможет вам решить эту проблему.

PowerShell Получить -Appxpackage не работает

Сообщение об ошибке, которое вы можете увидеть, может отличаться, но обычно оно выглядит следующим образом:

Get-AppxPackage : служба не может быть запущена либо потому, что она отключена, либо потому, что с ней не связаны активные устройства
. Службу невозможно запустить либо потому, что она отключена, либо потому, что с ней не связаны активные устройства.

PowerShell Get-Appxpackage не работает

  1. Запуск PowerShell с правами администратора
  2. Проверить права доступа к целевому каталогу
  3. Проверьте статус службы развертывания AppX.

При изменении разрешений для папок убедитесь, что вы не удалили уже доступные учетные записи пользователей.

1] Запуск PowerShell с правами администратора

  • Нажмите кнопку "Пуск" и введите PowerShell.
  • Когда он появится в списке, щелкните правой кнопкой мыши и выберите "Запуск от имени администратора".
  • Выполните команду, и она должна работать без ошибок.

Помимо отказа в разрешении, вы также можете получить сообщение об ошибке Not Recognized or Not Working. В то время как «Не распознан» относится к разрешению администратора, «Не работает» относится к Службам.

Перейдите к оснастке «Службы» и найдите Службу клиентских лицензий (ClipSVC) и Службу развертывания AppX (AppXSVC). Убедитесь, что они доступны и работают.

2] Проверить права доступа к целевому каталогу

  • Перейдите в папку "Назначение", щелкните правой кнопкой мыши и выберите "Свойства".
  • Затем перейдите на вкладку "Безопасность".
  • Проверьте, доступен ли ваш аккаунт и есть ли у него полные права доступа.
  • Вам также необходимо проверить, доступна ли учетная запись пользователя системы и имеет ли она полный доступ.
  • Если нет, вы можете нажать кнопку "Изменить" и добавить их вместе с разрешением.

3] Проверьте статус службы развертывания AppX

В консоли PowerShell запустите Get-Service "AppXSvc" и посмотрите.

Статус службы развертывания AppX (AppXSVC) должен быть «Работает».

Если отображается сообщение "Остановлено", откройте командную строку от имени администратора и выполните:

В качестве альтернативы вы можете открыть Regedit и перейти к:

Здесь установите значение «Пуск» на «3» и перезагрузите компьютер.

Опубликуйте эти изменения, вы сможете выполнить команду, и ошибка больше не должна возникать.

Как включить AppxPackage?

Эта команда и связанные с ней файлы уже доступны в Windows, и вам не нужно ничего устанавливать. Однако убедитесь, что вы выполняете его с правами администратора, иначе он скажет, что команда не распознана.

Как восстановить встроенные приложения в Windows?

Откройте PowerShell с правами администратора и выполните следующую команду, чтобы восстановить все встроенные приложения в Windows.

Это займет некоторое время, и все приложения, доступные при первой настройке Windows, станут доступны.

Я надеюсь, что за публикацией было легко следить, и вы ясно понимаете причины ошибки.

Я пытаюсь удалить такие файлы, как desktop.ini, Thumbs.db и т. д., используя следующую команду powershell для рекурсии по корневому каталогу на внешнем жестком диске:

Но я продолжаю получать следующую ошибку:

Командная строка, в которой я запускаю powershell (для запуска приведенной выше команды), запускается от имени администратора, поэтому я не знаю, почему я все еще получаю сообщение «Отказано в доступе».

Даже если я удалю часть Remove-Item, чтобы просто перечислить файлы, соответствующие этим именам файлов, я все равно получаю указанную выше ошибку.

Я также попытался добавить тег -Verbose, чтобы узнать, попадает ли в список папка, которая выдает сообщение "Отказано в доступе", но этого не происходит.

Есть идеи, как заставить работать приведенную выше команду?

Запустите код в PowerShell ISE и добавьте переменную для захвата текущего файла, используйте возможность отладки сценария и обновите свой вопрос, чтобы указать, в каком файле произошла ошибка

1 Ответ 1

Контроль доступа может быть установлен настолько жестко, что даже пользователь с правами администратора может просматривать содержимое некоторых папок. В UserProfile следующие пути будут вызывать ошибки AccessDenied:

  • $Env:UserProfile\AppData\Local\Application Data
    $Env:UserProfile\AppData\Local\History
    $Env:UserProfile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5
    $Env:UserProfile\AppData\Local\Microsoft\Windows\INetCache\Low\Content.IE5 $Env:UserProfile\AppData\Local\Microsoft\Windows\Temporary
    Интернет-файлы
    $Env :UserProfile\AppData\Local\Temporary Internet Files
    $Env:UserProfile\Application Data
    $Env:UserProfile\Cookies
    $Env:UserProfile\Documents\My Music
    $Env :UserProfile\Documents\My Pictures
    $Env:UserProfile\Documents\My Videos
    $Env:UserProfile\Local Settings
    $Env:UserProfile\My Documents
    $Env:UserProfile \NetHood
    $Env:UserProfile\PrintHood
    $Env:UserProfile\Recent
    $Env:UserProfile\SendTo
    $Env:UserProfile\Меню Пуск
    $Env: Профиль пользователя\Шаблоны

Они случайно являются пересечениями, но в конечном итоге такое поведение связано с разрешениями.

Я создал приведенный выше список с помощью следующего фрагмента кода PowerShell. Он собирает все пути, по которым возникает ошибка при попытке рекурсивной итерации, а также атрибуты папки и список управления доступом (ACL).

При запуске из корня системного диска первые два элемента будут такими:

Читайте также: