2009-07-10 14 views
5

Napisałem prostą usługę systemu Windows, która uruchomi exe określony w metodzie usługi usługi onstart(). Po uruchomieniu usługi exe wystrzelił w pamięci tylko , ale nie wyświetla się w eksploratorze.Uruchamianie aplikacji GUI z usługi Windows - okno nie pojawia się

Próbuję uruchomić calc.exe z mojego kodu.it pokazuje exe w pamięci, ale to nie wchodzi w mój widok (tj.) W eksploratorze.

Poniżej jest mój kod, aby uruchomić exe w metodzie onStart()

Process pr=new Process(); 
    pr.StartInfo.FileName="calc.exe"; 
    pr.StartInfo.WindowStyle=ProcessWindowStyle.Maximized; 
    pr.StartInfo.CreateNoWindow=false; 
    pr.Start(); 
// pr.WaitForExit(); 
+0

Czego można się spodziewać? Zamiast tego spróbuj uruchomić plik wsadowy. –

+0

Jakiego typu exe próbujesz uruchomić? – abhilash

+0

Proszę zmienić zdanie na coś bardziej znaczącego. Nie ma wiele do powiedzenia podczas przeglądania listy pytań ... – Hemant

Odpowiedz

1

Usługi nie są interaktywne z definicji, więc nie należy się spodziewać żadnych elementów interfejsu użytkownika, aby pokazać po uruchomieniu aplikacji z serwis.

Jest to zgodne z projektem ...

4

Usługi prowadzone są pod uwagę różne przywileje (LocalService/sieciowa itp), a zatem nie mają dostępu do pulpitu (pod kontroli Twojego konta się zalogować).

Usługi mają na celu wykonanie ich pracy w sposób cichy i to, co powinni zrobić. (z wyjątkiem logowania się w dzienniku zdarzeń systemu Windows, gdy mają coś ważnego do powiedzenia)

+0

Ponadto Menedżer zadań domyślnie wyświetla tylko procesy działające pod * twoim * kontem logowania. – MSalters

10

Usługi uruchamiane w innej sesji w systemie Vista lub późniejszym i aplikacje uruchomione bezpośrednio z usług są uruchamiane domyślnie w tej samej sesji. Uruchamianie aplikacji w innych sesjach jest możliwe - musisz znaleźć identyfikator sesji użytkownika i użyć CreateProcessAsUser.

Jeśli jest zalogowany więcej niż jeden użytkownik i musisz uruchomić program dla wszystkich użytkowników, musisz znaleźć identyfikatory wszystkich sesji.

Oto przykładowy kod:

int session = Win32.WTSGetActiveConsoleSessionId(); 
if (session == 0xFFFFFFFF) 
{ 
    return false; 
} 

IntPtr userToken; 
bool res = Win32.WTSQueryUserToken(session, out userToken); 
if (!res) 
{ 
    this.log.WriteEntry("Error WTSQueryUserToken"); 
    return false; 
} 

string path = GetPath(); 
string dir = Path.GetDirectoryName(path); 
Win32.STARTUPINFO si = new Win32.STARTUPINFO(); 
si.lpDesktop = "winsta0\\default"; 
si.cb = Marshal.SizeOf(si); 

Win32.PROCESS_INFORMATION pi = new Win32.PROCESS_INFORMATION(); 
Win32.SECURITY_ATTRIBUTES sa = new Win32.SECURITY_ATTRIBUTES(); 
sa.bInheritHandle = 0; 
sa.nLength = Marshal.SizeOf(sa); 
sa.lpSecurityDescriptor = IntPtr.Zero; 

if (!Win32.CreateProcessAsUser(userToken,  // user token 
           path,   // exexutable path 
           string.Empty, // arguments 
           ref sa,   // process security attributes (none) 
           ref sa,   // thread security attributes (none) 
           false,   // inherit handles? 
           0,    // creation flags 
           IntPtr.Zero, // environment variables 
           dir,   // current directory of the new process 
           ref si,   // startup info 
           out pi))  // receive process information in pi 
{ 
    int error = Marshal.GetLastWin32Error(); 
    this.log.WriteEntry("Error CreateProcessAsUser:" + error); 
    return false; 
} 
0

Jak już wspomniano od innych usługą Windows jest „normalnie” działających w ramach odrębnego rachunku („lokalny” lub „sieciowa”). To jest powód, dla którego możesz nie widzieć interfejsu użytkownika programu uruchomionego przez twoją usługę. Również usługi nie mają interfejsu użytkownika, działają jako usługa w tle.

Należy jednak pamiętać, że uruchomienie aplikacji przez usługę może być bardzo niebezpieczne, ponieważ aplikacja działa z tymi samymi uprawnieniami, co usługa. Zwykle byłoby to konto systemu lokalnego.

Nie wiem, co próbujesz osiągnąć za pomocą swojej usługi, ale zastanów się, czy użyć funkcji autostartu Windows zamiast usługi do uruchomienia aplikacji.

3

Jeśli otworzysz okno właściwości usługi, przejdź do zakładki Logowanie, a następnie zaznacz pole wyboru "Zezwalaj usłudze na interakcję z komputerem", aby uzyskać pożądane działanie. Również w zależności od tego, którą aplikację chcesz uruchomić, konieczna może być zmiana loginu na koncie.

+0

Niestety działa to tylko dla konta usługi :( – Grzenio

Powiązane problemy