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 по аналогичной проблеме с доступным исправлением. Помог мне решить проблему.