Запуск SFC.EXE из скрипта Powershell, развернутого через SCCM
Я пытаюсь создать сценарий Powershell, который будет развернут на любом узле с плохим состоянием обновления, чтобы автоматизировать некоторые простые задачи без необходимости прерывать пользователей в течение их рабочего дня. Скрипт Powershell отлично работает, если он запускается из командной строки с повышенными правами PS. Он также работает нормально, когда тот же сценарий развертывается на тестовой машине через SCCM с одним исключением: он не будет вызывать SFC.EXE /SCANNOW
,
Я пытался использовать:
Start-Process -FilePath "${env:Windir}\System32\SFC.EXE" -ArgumentList '/scannow' -Wait -NoNewWindow
Start-Process -FilePath "sfc.exe" -ArgumentList '/scannow' -Wait -NoNewWindow
Start-Process -FilePath "${env:Windir}\System32\SFC.EXE" -ArgumentList '/scannow' -RedirectStandardOutput "C:\SFC-Out.log" -RedirectStandardError "C:\SFC-Err.log" -Wait -NoNewWindow
& "sfc.exe" "/scannow"
Invoke-Command -ScriptBlock { sfc.exe /scannow }
Опять же, все эти примеры работают точно так, как задумано, при запуске из приглашения PS с повышенными правами, но не работают при запуске из развернутого сценария PowerShell. Когда я использовал -RedirectStandardOutput, я проверил файл SFC-Out.log, и он прочитал:
"Windows Resource Protection не удалось запустить службу восстановления"
Я думаю, это потому, что SCCM запускает программы / сценарии в контексте SYSTEM вместо пользовательского (или даже повышенного пользовательского контекста, но предполагается, что SYSTEM выше, чем повышенный сеанс).
Есть ли способ сделать это? Извините за плохое форматирование, это мой первый пост на этом сайте.
5 ответов
Немного поздно, но я столкнулся с той же проблемой. Не уверен, что это так, но причиной была настройка развертывания сценария с SCCM для запуска как 32-разрядного процесса. Скрипт был развернут на 64-битных системах. Когда я снял флажок "запускать как 32-разрядный процесс" в конфигурации развертывания, SFC работал без проблем в контексте системной учетной записи.
То, что у вас есть, будет работать, просто отсутствует "-Verb RunAs" для повышения разрешений. Итак, ваш командлет должен читать:-
Start-Process -FilePath "${env:Windir}\System32\SFC.EXE" -ArgumentList '/scannow' -Wait -Verb RunAs
Я создал пакет (не приложение) в SCCM и должен был использовать перенаправление, используя неуловимую папку sysnative для машин x64:
https://www.thewindowsclub.com/sysnative-folder-in-windows-64-bit
Так было бы:
C: \ Windows \ Sysnative \ SFC.EXE / SCANNOW
Перенесемся к SCCM Current Branch 2109, и я смог решить эту проблему с помощью новой функции сценариев, встроенной в SCCM. С использованием
& 'sfc.exe' '/scannow'
работает, и я могу вручную запустить этот сценарий для любой коллекции устройств, показывающей устройства с ошибкой.
Start-Process -FilePath "sfc.exe" -ArgumentList "/scannow" -NoNewWindow -Wait
тоже работает.
Я читал и искал это в Интернете, пока единственный ответ заключается в том, что его нельзя запустить из-за
sccm
с помощью системной учетной записи. Такое же поведение при попытке запустить
winmgt
.