Musiałem ostatnio stworzyć program który będzie uruchamiał aplikację (dokładnie mstsc.exe) na komputerach produkcyjnych i dodatkowo zabroni użytkownikom jej zamknąć.
Jak sami się domyślacie nie da się zabronić użytkownikowi zamykać aplikacji jeśli ona sama nie ma wbudowanej takiej funkcjonalności.
Idea jest prosta zew. aplikacja uruchomi połączenie zdalnego pulpitu mstsc.exe i poczeka na jego zamkniecie używając WaitForSingleObject() jeśli aplikacja wykryje, że program został zamknięty to uruchomi go ponownie i tak na okrągło while(true) 🙂
Jednak testując aplikację na Windows 7 program jak by nie mógł kontrolować uruchamianego procesu. Wygląda to tak że mimo iż pulpit cały czas jest podłączony aplikacja uruchamia następną sesję myśląc że tamta została zakończone co skutkuję restartem komputera po odpaleniu 9999999999 ilości procesów mstsc. Co śmieszniejsze ten przypadek miałem tylko na W2k8 i Windows 7.
Testowałem moją aplikację z innymi programami np. notepad i wszystko działa pięknie…
Dopiero po jednodniowej walce odkryłem co jest grane. Problem nie leży w aplikacji ani procedurze WaitForSingleObject tylko w Systemach 64 bitowych, dlatego na XP działało bez problemu ponieważ wszystko XP które posiadam są x86.
Ale do rzeczy:
– Aplikacja mstsc.exe w systemie x64 jest 32 bitowa i jest zlokalizowana w folderze SysWOW64 w katalogu windows.
– Dla kompatybilności w system32 (tu znajdują się programy 64bit) też jest program o nazwie mstsc.exe i jest 64 bitowy jednak ten służy tylko do uruchomienia programy 32bitowego.
Jak się domyślacie uruchomienie mstsc w systemie x64 uruchamia program który nie jest pulpitem zdalnym tylko uruchamia proces 32 bitowy i wychodzi dlatego WaitForSingleObject myśli że program został zamknięty mimo że cały czas zdalne połączenie działa bo to zupełnie inny proces.
Ten przypadek tyczy się wszystkich programów 32bitowych uruchamianych przez odpowiedniki 64bitowe 🙂
Rozwiązanie jest dość proste:
1) nadaj sobie pełne uprawnienia do programy z system32 (np mstsc.exe)
2) Usuń go lub zmień nazwę.
3) od teraz możesz uruchomić program bezpośrednio z Windows\SysWOW64\mstsc.exe który jest 32bitowy i w ten sposób używać mojego programu i kontrolować jego zamykanie.
Program dostępny jest na stronie:
https://www.coreblog.pl/narzedzia/loop-exe/