Delen via


Interactieve services

Services zijn doorgaans consoletoepassingen die zijn ontworpen om zonder grafische gebruikersinterface (GUI) zonder toezicht uit te voeren. Sommige services kunnen echter af en toe interactie met een gebruiker vereisen. Op deze pagina worden de beste manieren besproken om met de gebruiker te communiceren vanuit een service.

Belangrijk

Services kunnen niet rechtstreeks met een gebruiker communiceren vanaf Windows Vista. Daarom mogen de technieken die worden genoemd in de sectie getiteld Using an Interactive Service, niet worden gebruikt in nieuwe code.

 

Indirect interactie met een gebruiker van een service

U kunt de volgende technieken gebruiken om met de gebruiker te communiceren vanuit een service op alle ondersteunde versies van Windows:

  • Een dialoogvenster weergeven in de sessie van de gebruiker met behulp van de WTSendMessage functie.

  • Maak een afzonderlijke verborgen GUI-toepassing en gebruik de functie CreateProcessAsUser om de toepassing uit te voeren binnen de context van de interactieve gebruiker. Ontwerp de GUI-toepassing om met de service te communiceren via een bepaalde methode voor communicatie tussen processen (IPC), bijvoorbeeld benoemde pipes. De service communiceert met de GUI-toepassing om aan te geven wanneer de GUI moet worden weergegeven. De toepassing communiceert de resultaten van de gebruikersinteractie terug naar de service, zodat de service de juiste actie kan ondernemen. IPC kan uw service-interfaces beschikbaar maken via het netwerk, tenzij u een geschikte toegangsbeheerlijst (ACL) gebruikt.

    Als deze service wordt uitgevoerd op een systeem met meerdere gebruikers, voegt u de toepassing toe aan de volgende sleutel, zodat deze in elke sessie wordt uitgevoerd: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Als de toepassing gebruikmaakt van benoemde pijpen voor IPC, kan de server onderscheid maken tussen meerdere gebruikersprocessen door elke pijp een unieke naam te geven op basis van de sessie-id.

De volgende techniek is ook beschikbaar voor Windows Server 2003 en Windows XP:

  • Een berichtvak weergeven door de functie MessageBox aan te roepen met MB_SERVICE_NOTIFICATION. Dit wordt aanbevolen voor het weergeven van eenvoudige statusberichten. Roep MessageBox niet aan tijdens de initialisatie van de service of vanuit de HandlerEx- routine, tenzij u het aanroept vanuit een afzonderlijke thread, zodat u tijdig terugkeert naar de SCM.

Een interactieve service gebruiken

Services maken standaard gebruik van een niet-interactief vensterstation en kunnen niet communiceren met de gebruiker. Een interactieve service kan echter een gebruikersinterface weergeven en gebruikersinvoer ontvangen.

Voorzichtigheid

Services die worden uitgevoerd in een verhoogde beveiligingscontext, zoals het LocalSystem-account, mogen geen venster op het interactieve bureaublad maken, omdat andere toepassingen die op het interactieve bureaublad worden uitgevoerd, met dit venster kunnen communiceren. Hierdoor wordt de service beschikbaar gesteld voor elke toepassing die door een aangemelde gebruiker wordt uitgevoerd. Bovendien mogen services die als LocalSystem worden uitgevoerd, geen toegang krijgen tot het interactieve bureaublad door de functie OpenWindowStation of GetThreadDesktop- aan te roepen.

 

Ga als volgt te werk om een interactieve service te maken wanneer u de functie CreateService aanroept:

  1. Geef NULL op voor de parameter lpServiceStartName om de service uit te voeren in de context van het LocalSystem-account.
  2. Geef de vlag SERVICE_INTERACTIVE_PROCESS op.

Als u wilt bepalen of een service wordt uitgevoerd als een interactieve service, roept u de functie GetProcessWindowStation aan om een ingang op te halen naar het vensterstation en de Functie GetUserObjectInformation om te testen of het vensterstation het kenmerk WSF_VISIBLE heeft.

Houd er echter rekening mee dat de volgende registersleutel een waarde bevat, NoInteractiveServices, waarmee het effect van SERVICE_INTERACTIVE_PROCESS wordt bepaald:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

De NoInteractiveServices waarde is standaard ingesteld op 1, wat betekent dat er geen service interactief mag worden uitgevoerd, ongeacht of deze SERVICE_INTERACTIVE_PROCESSheeft. Wanneer NoInteractiveServices is ingesteld op een 0, kunnen services met SERVICE_INTERACTIVE_PROCESS interactief worden uitgevoerd.

Windows 7, Windows Server 2008 R2, Windows XP en Windows Server 2003: De NoInteractiveServices--waarde is standaard ingesteld op 0, wat betekent dat services met SERVICE_INTERACTIVE_PROCESS interactief mogen worden uitgevoerd. Wanneer NoInteractiveServices is ingesteld op een niet-nulwaarde, mag er daarna geen service interactief worden uitgevoerd, ongeacht of deze SERVICE_INTERACTIVE_PROCESSheeft.

Belangrijk

Alle services worden uitgevoerd in Terminal Services-sessie 0. Als een interactieve service daarom een gebruikersinterface weergeeft, is deze alleen zichtbaar voor de gebruiker die verbinding heeft gemaakt met sessie 0. Omdat er geen manier is om te garanderen dat de interactieve gebruiker is verbonden met sessie 0, configureert u geen service die moet worden uitgevoerd als een interactieve service onder Terminal Services of op een systeem dat ondersteuning biedt voor snelle gebruikerswisseling (snelle gebruikerswisseling wordt geïmplementeerd met Terminal Services).