c # - Hvordan kan jeg få MainWindowHandle til et Windows 7-program kører som bruger < foo > fra en tjeneste, der kører som Local System?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har oprettet en tjeneste, der kører som Local System-brugeren. Denne service lancerer og overvåger en Silverlight Out-of-Browser-applikation ved hjælp af native interop og CreateProcessAsUser () -metoden (for at køre den som den nuværende logget bruger i stedet for Lokalt system.) Jeg kan få et håndtag på den frembragte proces og gøre ting som Kill () det er jeg imidlertid blevet opmærksom på, at tjenesten ikke er i stand til at få et håndtag til hovedvinduet i børneapplikationen fordi børneprogrammet kører som en anden bruger. Jeg kører på Windows 7.


Mit mål er at reagere korrekt, når processen ikke længere svarer (dvs. Process.Responding == false), så jeg kan dræbe programmet og genstarte det. Imidlertid kræver Process.Responding et håndtag til hovedvinduet i processen (Process.MainWindowHandle, for at være præcis). I dette scenario returnerer Process.MainWindowHandle altid 0.


Jeg er stumpet her. Er der nogen måde for en bruger at få et vindueshåndtag til en proces, der kører som en anden bruger i Win 7?


Tak på forhånd for enhver hjælp.

Bedste reference


Nej, det er ikke muligt. Windows Services er helt isoleret fra brugertilstandsprogrammer af sikkerhedsgrunde. Hvis du kunne få håndtaget til et vindue, kan du manipulere og ellers interagerer med vinduet, hvilket giver en enorm sikkerhedssvaghed.


Flere oplysninger er tilgængelige her:



  • Hvordan kan en Windows Service starte en proces, når en Timer-hændelse hæves?

  • Hvordan kan jeg køre et EXE-program fra en Windows-tjeneste ved hjælp af C #?

  • Windows-service (tillad service til at interagere med skrivebord)

  • Har brug for forslag til udskiftning af Windows Service med usynlig WinForm Application



Strengt taget er det, hvad du bruger Windows-tjenesten til i først , et dårligt design. Det bør ikke være at skabe eller starte nogen brugermodusprocesser eller interagere med brugeren på nogen måde. Husk at tjenester kører, selv når der ikke er logget på nogen bruger! De bør derfor ikke starte applikationer.


En bedre løsning er en simpel baggrundsapplikation, der skal startes automatisk, når brugeren logger ind. Denne baggrundsapplikation kan så starte Silverlight-applikationen, overvåge dens tilstand og interagere med den efter behov, fordi begge ville løbe under konteksten af samme lokale brugerkonto. Effekten ligner en tjeneste, men uden nogen af ​​ulemperne ved isolering. Den nemmeste måde at gøre dette på i Visual Studio er at oprette en WinForms-applikation (eller muligvis en WPF-applikation, jeg har mindre erfaring på dette område), der simpelthen ikke viser nogen formularer/windows.