Dela via


Interaktiva tjänster

Vanligtvis är tjänster konsolprogram som är utformade för att köra obevakade utan ett grafiskt användargränssnitt (GUI). Vissa tjänster kan dock kräva tillfällig interaktion med en användare. På den här sidan beskrivs de bästa sätten att interagera med användaren från en tjänst.

Viktig

Tjänster kan inte interagera direkt med en användare från och med Windows Vista. Därför bör de tekniker som nämns i avsnittet Med en interaktiv tjänst inte användas i ny kod.

 

Interagera med en användare från en tjänst indirekt

Du kan använda följande tekniker för att interagera med användaren från en tjänst i alla versioner av Windows som stöds:

  • Visa en dialogruta i användarens session med hjälp av funktionen WTSSendMessage.

  • Skapa ett separat dolt GUI-program och använd funktionen CreateProcessAsUser för att köra programmet i kontexten för den interaktiva användaren. Utforma GUI-programmet så att det kommunicerar med tjänsten via någon metod för interprocesskommunikation (IPC), till exempel namngivna pipes. Tjänsten kommunicerar med GUI-programmet för att tala om för den när gui-gränssnittet ska visas. Programmet kommunicerar resultatet av användarinteraktionen tillbaka till tjänsten så att tjänsten kan vidta lämpliga åtgärder. Observera att IPC kan exponera dina tjänstgränssnitt över nätverket om du inte använder en lämplig åtkomstkontrollista (ACL).

    Om den här tjänsten körs på ett system med flera användare lägger du till programmet i följande nyckel så att det körs i varje session: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Om programmet använder namngivna pipes för IPC kan servern skilja mellan flera användarprocesser genom att ge varje pipe ett unikt namn baserat på sessions-ID:t.

Följande teknik är också tillgänglig för Windows Server 2003 och Windows XP:

  • Visa en meddelanderuta genom att anropa funktionen MessageBox med MB_SERVICE_NOTIFICATION. Detta rekommenderas för att visa enkla statusmeddelanden. Anropa inte MessageBox- under tjänstens initiering eller från HandlerEx- rutin, såvida du inte anropar den från en separat tråd, så att du återgår till SCM i tid.

Använda en interaktiv tjänst

Som standard använder tjänsterna en icke-interaktiv fönsterstation och kan inte interagera med användaren. En interaktiv tjänst kan dock visa ett användargränssnitt och ta emot användarindata.

Försiktighet

Tjänster som körs i en upphöjd säkerhetskontext, till exempel LocalSystem-kontot, bör inte skapa ett fönster på det interaktiva skrivbordet eftersom andra program som körs på det interaktiva skrivbordet kan interagera med det här fönstret. Detta exponerar tjänsten för alla program som en inloggad användare kör. Tjänster som körs som LocalSystem bör inte heller komma åt det interaktiva skrivbordet genom att anropa funktionen OpenWindowStation eller GetThreadDesktop.

 

Om du vill skapa en interaktiv tjänst gör du följande när du anropar funktionen CreateService:

  1. Ange NULL för parametern lpServiceStartName för att köra tjänsten i kontexten för LocalSystem-kontot.
  2. Ange flaggan SERVICE_INTERACTIVE_PROCESS.

För att avgöra om en tjänst körs som en interaktiv tjänst anropar du funktionen GetProcessWindowStation för att hämta ett handtag till fönsterstationen och funktionen GetUserObjectInformation för att testa om fönsterstationen har attributet WSF_VISIBLE.

Observera dock att följande registernyckel innehåller ett värde, NoInteractiveServices, som styr effekten av SERVICE_INTERACTIVE_PROCESS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

Värdet NoInteractiveServices är standardvärdet 1, vilket innebär att ingen tjänst tillåts köras interaktivt, oavsett om det har SERVICE_INTERACTIVE_PROCESS. När NoInteractiveServices är inställt på en 0 tillåts tjänster med SERVICE_INTERACTIVE_PROCESS köras interaktivt.

Windows 7, Windows Server 2008 R2, Windows XP och Windows Server 2003: Värdet NoInteractiveServices är standardvärdet 0, vilket innebär att tjänster med SERVICE_INTERACTIVE_PROCESS tillåts köras interaktivt. När NoInteractiveServices är inställt på ett värde som inte är noll tillåts ingen tjänst som startas därefter att köras interaktivt, oavsett om den har SERVICE_INTERACTIVE_PROCESS.

Viktig

Alla tjänster körs i Terminal Services-session 0. Om en interaktiv tjänst visar ett användargränssnitt visas det därför endast för den användare som är ansluten till session 0. Eftersom det inte finns något sätt att garantera att den interaktiva användaren är ansluten till session 0 ska du inte konfigurera en tjänst som ska köras som en interaktiv tjänst under Terminal Services eller på ett system som stöder snabb användarväxling (snabb användarväxling implementeras med Terminal Services).