Występuje dziwne zachowanie z połączeniem uruchomienia procesu Powerhell.powershell Kod wyjścia uruchomienia procesu -1073741502 w przypadku użycia z poświadczeniem z poziomu środowiska systemu Windows
Oto wezwanie:
$process = start-process `
"C:\somepath\MyBinary.exe" `
-PassThru `
-Credential $defaultCredential `
-Wait `
-WorkingDirectory "C:\somepath" `
-LoadUserProfile
if ($process.ExitCode -ne 0)
{
#do something
}
toll zawsze powrócić z kodem wyjścia - 1073741502
.
Po szybkim wyszukiwaniu ten kod wyjścia wydaje się być związany z ogólnym błędem, gdy program nie może załadować wymaganego pliku dll (czyli STATUS_DLL_INIT_FAILED
).
Po uruchomieniu go bez -Credential $credential
program działa poprawnie.
Aby wyizolować problem, ręcznie uruchomiłem some.exe
w wierszu z moimi docelowymi poświadczeniami i działa on płynnie.
Problem pojawia się tylko dlatego, że polecenie cmdlet start-process skutecznie uruchamia proces.
Znalazłem potencjalne rozwiązania tego problemu, które starałem się zastosować bez powodzenia: link i link.
Czy masz pojęcie, co się tutaj dzieje?
Edit 1:
Prowadzę mon proc dla działań programu monitorowania po uruchomieniu bezpośrednio lub za pośrednictwem skryptu PowerShell. Problem pojawia się podczas ładowania kernelbase.dll
.
Local procmon dump (roboczy):
9:06:35.3837439 AM MyBinary.exe 2620 Load Image C:\Windows\SysWOW64\kernelbase.dll SUCCESS Image Base: 0x76270000, Image Size: 0x47000
9:06:35.4317417 AM MyBinary.exe 2620 RegOpenKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions REPARSE Desired Access: Read
9:06:35.4317751 AM MyBinary.exe 2620 RegOpenKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions SUCCESS Desired Access: Read
9:06:35.4318016 AM MyBinary.exe 2620 RegSetInfoKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions SUCCESS KeySetInformationClass: KeySetHandleTagsInformation, Length: 0
9:06:35.4318152 AM MyBinary.exe 2620 RegQueryValue HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions\(Default) SUCCESS Type: REG_SZ, Length: 36, Data: 00060101.00060101
...
PowerShell procmon (braku znaleźć wyjście gwintu oraz wyjście procesu kodu - 1073741502
):
9:35:07.9455191 AM MyBinary.exe 2276 Load Image C:\Windows\SysWOW64\kernelbase.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:\Windows\System32\apisetschema.dll SUCCESS Name: \Windows\System32\apisetschema.dll
9:35:07.9537686 AM MyBinary.exe 2276 QueryNameInformationFile C:\somepath\MyBinary\MyBinary.exe SUCCESS Name: \somepath\MyBinary\MyBinary.exe
9:35:07.9537914 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\wow64cpu.dll SUCCESS Name: \Windows\System32\wow64cpu.dll
9:35:07.9538134 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\wow64win.dll SUCCESS Name: \Windows\System32\wow64win.dll
9:35:07.9538349 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\wow64.dll SUCCESS Name: \Windows\System32\wow64.dll
9:35:07.9538579 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\ntdll.dll SUCCESS Name: \Windows\System32\ntdll.dll
9:35:07.9538796 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\SysWOW64\ntdll.dll SUCCESS Name: \Windows\SysWOW64\ntdll.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
Edycja 2:
I powinien wspomnieć o skrypcie powershell uruchamianym z usługi (to bambusowy agent usługi). A ja po prostu znaleźć to thread mówiąc:
Process.Start zwraca wewnętrznie CreateProcessWithLogonW (CPLW) gdy poświadczenia są określone. CreateProcessWithLogonW nie można nazwać ze środowiska usług systemu Windows (takiego jak usługa IIS WCF). To może być wywołane tylko z procesu interaktywnego (aplikacja uruchomiona przez użytkownika, który zalogował się przez CTRL-ALT-DELETE).
Domyślam się, że wezwanie proces uruchamiania PowerShell czyni zastosowań CreateProcessWithLogonW
...
Edit 3:
Mój serwis jest prowadzony z niestandardowych użytkownika (bo nie może podszyć od systemu) , tak jak przeczytaj link. Sprawdziłem, czy włączono opcję "Zezwalaj na interakcję z komputerem". Ponieważ jest on dostępny tylko dla kont niestandardowych, ustawiam go ręcznie w rejestrze, zmieniając klucz typu HKLM\System\CurrentControlSet\Services\%myservice%
(zgodnie z opisem here i here).
Konto, na którym używasz referencji, prawdopodobnie nie ma praw dostępu do miejsca, w którym znajduje się część biblioteki dll, którą próbuje załadować. – EBGreen
Sprawdź prawa systemu plików w folderze z programem, sprawdź, czy użytkownik, którego używasz, ma co najmniej dostęp do całego łańcucha folderów i biblioteki DLL (jeśli jest zapisany) lub cały folder, jeśli nie jest. Jeśli występują problemy z uprawnieniami dostępu, udziel mu odczytu + wykonania. – Vesper
Dzięki temu już sprawdziłem, uprawnienia wydają się być poprawnie ustawione. Użytkownik jest członkiem zarówno Użytkowników, jak i Administratora i ma pełną kontrolę nad folderem zawierającym plik binarny. –