powershell Start-Process exit code -1073741502 при использовании с учетными данными из среды службы windows
я сталкиваюсь со странным поведением с вызовом запуска процесса powershell.
вот вызов:
$process = start-process `
"C:somepathMyBinary.exe" `
-PassThru `
-Credential $defaultCredential `
-Wait `
-WorkingDirectory "C:somepath" `
-LoadUserProfile
if ($process.ExitCode -ne 0)
{
#do something
}
этот вызов всегда возвращается с кодом выхода -1073741502
.
После быстрого поиска этот код выхода, похоже, связан с общей ошибкой, когда программа не может загрузить требуемую dll (ака. STATUS_DLL_INIT_FAILED
).
когда я запускаю его без -Credential $credential
программа работает правильно.
чтобы изолировать проблему, я вручную запущен some.exe
в приглашении с моими целевыми учетными данными, и он работает гладко.
таким образом, проблема, похоже, связана только с тем, как командлет start-process эффективно запускает процесс.
Я нашел некоторые потенциальные решения этой проблемы, которые я пытался применить без успеха:ссылке и ссылке.
Вы имеете представление о том, что здесь происходит ?
Edit 1:
Я запускаю proc mon для мониторинг действий программы при запуске непосредственно или через сценарий powershell. Проблема возникает при загрузке kernelbase.dll
.
локальный дамп procmon (рабочий):
9:06:35.3837439 AM MyBinary.exe 2620 Load Image C:WindowsSysWOW64kernelbase.dll SUCCESS Image Base: 0x76270000, Image Size: 0x47000
9:06:35.4317417 AM MyBinary.exe 2620 RegOpenKey HKLMSystemCurrentControlSetControlNlsSortingVersions REPARSE Desired Access: Read
9:06:35.4317751 AM MyBinary.exe 2620 RegOpenKey HKLMSystemCurrentControlSetControlNlsSortingVersions SUCCESS Desired Access: Read
9:06:35.4318016 AM MyBinary.exe 2620 RegSetInfoKey HKLMSystemCurrentControlSetControlNlsSortingVersions SUCCESS KeySetInformationClass: KeySetHandleTagsInformation, Length: 0
9:06:35.4318152 AM MyBinary.exe 2620 RegQueryValue HKLMSystemCurrentControlSetControlNlsSortingVersions(Default) SUCCESS Type: REG_SZ, Length: 36, Data: 00060101.00060101
...
Powershell procmon (сбой, см. раздел выход потока и код выхода процесса -1073741502
):
9:35:07.9455191 AM MyBinary.exe 2276 Load Image C:WindowsSysWOW64kernelbase.dll SUCCESS Image Base: 0x76270000, Image Size: 0x47000
9:35:07.9537146 AM MyBinary.exe 2276 Thread Exit SUCCESS Thread ID: 5112, User Time: 0.0000000, Kernel Time: 0.0000000
9:35:07.9537386 AM MyBinary.exe 2276 QueryNameInformationFile C:WindowsSystem32apisetschema.dll SUCCESS Name: WindowsSystem32apisetschema.dll
9:35:07.9537686 AM MyBinary.exe 2276 QueryNameInformationFile C:somepathMyBinaryMyBinary.exe SUCCESS Name: somepathMyBinaryMyBinary.exe
9:35:07.9537914 AM MyBinary.exe 2276 QueryNameInformationFile C:WindowsSystem32wow64cpu.dll SUCCESS Name: WindowsSystem32wow64cpu.dll
9:35:07.9538134 AM MyBinary.exe 2276 QueryNameInformationFile C:WindowsSystem32wow64win.dll SUCCESS Name: WindowsSystem32wow64win.dll
9:35:07.9538349 AM MyBinary.exe 2276 QueryNameInformationFile C:WindowsSystem32wow64.dll SUCCESS Name: WindowsSystem32wow64.dll
9:35:07.9538579 AM MyBinary.exe 2276 QueryNameInformationFile C:WindowsSystem32ntdll.dll SUCCESS Name: WindowsSystem32ntdll.dll
9:35:07.9538796 AM MyBinary.exe 2276 QueryNameInformationFile C:WindowsSysWOW64ntdll.dll SUCCESS Name: WindowsSysWOW64ntdll.dll
9:35:07.9539425 AM MyBinary.exe 2276 Process Exit SUCCESS Exit Status: -1073741502, User Time: 0.0000000 seconds, Kernel Time: 0.0000000 seconds, Private Bytes: 339,968, Peak Private Bytes: 401,408, Working Set: 1,523,712, Peak Working Set: 1,826,816
Edit 2:
Я должен упомянуть, что сценарий powershell запускается из службы (это агент Службы bamboo). И я только что нашел это нить говорит:
3 ответов
start-process
- это псевдоним для System.Diagnostics.Process.Start()
, Так что да, он использует CreateProcessWithLogonW()
. Как уже отмечалось, этот метод нельзя вызвать из процесса службы, его можно вызвать только из "интерактивного" процесса. Предостережение к этому "только" - это то, что вы обнаружили, что, когда вы не меняете учетные данные, он может, по крайней мере, начать процесс. (Это может быть даже ошибка - инженер поддержки Microsoft, с которым я говорил об этой проблеме, был "удивлен", что он вообще работал.)
только (поддерживается) способ запуска другого процесса изнутри процесса службы-использовать собственный метод Win32 API CreateProcessAsUser()
. Пример как это сделать C#.NET можно найти в ответ к вопросу, упомянутому в edit #2.
процесс Windows должен запускаться как часть сеанса пользователя. Если процесс запуска выполняется как часть интерактивного сеанса - типа, когда вы вошли в систему с помощью CTRL+ALT+DELETE и открыли рабочий стол-тогда вы можете использовать CreateProcessWithLogonW()
, которым будет использовать текущий сеанс пользователя автоматически. Если процесс запуска является сервисом или "пакетным" процессом (как и запланированные задачи), то процесс запуска должен либо создать новый сеанс пользователя (либо определить существующий), чтобы запустить новый процесс (что и делает код в вышеупомянутом ответе.)
единственное решение, которое я нашел до сих пор, - отключить UAC (установите EnableLUA в 0 = режим утверждения администратора в локальной политике безопасности). Таким образом, это определенно кажется проблемой доступа к файлу/папке/реестру, которую UAC игнорирует при отключении.
есть Microsoft KB 2701373 по аналогичной проблеме с доступным исправлением. Помог мне решить проблему.