Sdílet prostřednictvím


Interaktivní služby

Služby jsou obvykle konzolové aplikace navržené tak, aby běžely bezobslužně bez grafického uživatelského rozhraní (GUI). Některé služby však mohou vyžadovat občasnou interakci s uživatelem. Tato stránka popisuje nejlepší způsoby interakce s uživatelem ze služby.

Důležitý

Služby nemohou přímo komunikovat s uživatelem v systému Windows Vista. Proto by se techniky uvedené v části s názvem Používání interaktivní služby neměly používat v novém kódu.

 

Nepřímo interagování s uživatelem ze služby

K interakci s uživatelem ze služby ve všech podporovaných verzích Windows můžete použít následující techniky:

  • Zobrazení dialogového okna v relaci uživatele pomocí funkce WTSSendMessage.

  • Vytvořte samostatnou skrytou aplikaci grafického uživatelského rozhraní a pomocí funkce CreateProcessAsUser spusťte aplikaci v kontextu interaktivního uživatele. Navrhujte aplikaci grafického uživatelského rozhraní pro komunikaci se službou prostřednictvím některé metody komunikace mezi procesy (IPC), například pojmenovaných kanálů. Služba komunikuje s aplikací grafického uživatelského rozhraní, aby jí řekla, kdy se má grafické uživatelské rozhraní zobrazit. Aplikace sdělí výsledky interakce uživatele zpět se službou, aby služba mohl provést příslušnou akci. Mějte na paměti, že IPC může zveřejnit vaše rozhraní služeb přes síť, pokud nepoužíváte odpovídající seznam řízení přístupu (ACL).

    Pokud tato služba běží v systému s více uživateli, přidejte aplikaci do následujícího klíče, aby byla spuštěna v každé relaci: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Pokud aplikace používá pojmenované kanály pro IPC, může server rozlišovat mezi více uživatelskými procesy tím, že každému kanálu poskytne jedinečný název na základě ID relace.

Pro systém Windows Server 2003 a Windows XP je k dispozici také následující technika:

  • Zobrazení pole zprávy voláním MessageBox funkce s MB_SERVICE_NOTIFICATION. To se doporučuje pro zobrazení jednoduchých stavových zpráv. Nevolejte MessageBox během inicializace služby nebo z rutiny HandlerEx, pokud ji nezavoláte z samostatného vlákna, takže se k SCM vrátíte včas.

Použití interaktivní služby

Ve výchozím nastavení používají služby neinteraktivní okno stanice a nemůžou s uživatelem pracovat. Interaktivní služba ale může zobrazit uživatelské rozhraní a přijímat uživatelský vstup.

Opatrnost

Služby spuštěné v kontextu zabezpečení se zvýšenými oprávněními, jako je například účet LocalSystem, by neměly na interaktivní ploše vytvářet okno, protože s tímto oknem můžou pracovat jakákoli jiná aplikace spuštěná na interaktivní ploše. Tím se služba zpřístupní jakékoli aplikaci, kterou spouští přihlášený uživatel. Služby, které běží jako LocalSystem, by také neměly přistupovat k interaktivní ploše voláním funkce OpenWindowStation nebo GetThreadDesktop.

 

Pokud chcete vytvořit interaktivní službu, při volání funkce CreateService postupujte takto:

  1. Zadejte hodnotu NULL pro parametr lpServiceStartName ke spuštění služby v kontextu účtu LocalSystem.
  2. Zadejte příznak SERVICE_INTERACTIVE_PROCESS.

Pokud chcete zjistit, jestli je služba spuštěná jako interaktivní služba, zavolejte funkci GetProcessWindowStation, která načte popisovač do stanice oken, a GetUserObjectInformation funkce k otestování, zda má stanice oken WSF_VISIBLE atribut.

Všimněte si však, že následující klíč registru obsahuje hodnotu, NoInteractiveServices, který řídí účinek SERVICE_INTERACTIVE_PROCESS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

Hodnota NoInteractiveServices výchozí hodnota 1, což znamená, že žádná služba nemůže běžet interaktivně bez ohledu na to, jestli má SERVICE_INTERACTIVE_PROCESS. Pokud je NoInteractiveServices nastavená na 0, služby s SERVICE_INTERACTIVE_PROCESS se můžou spouštět interaktivně.

Windows 7, Windows Server 2008 R2, Windows XP a Windows Server 2003: Hodnota NoInteractiveServices výchozí hodnota 0, což znamená, že služby s SERVICE_INTERACTIVE_PROCESS mohou běžet interaktivně. Pokud je NoInteractiveServices nastavena na nenulovou hodnotu, není možné poté interaktivně spustit žádnou službu bez ohledu na to, zda má SERVICE_INTERACTIVE_PROCESS.

Důležitý

Všechny služby běží v relaci Terminálové služby 0. Pokud tedy interaktivní služba zobrazí uživatelské rozhraní, zobrazí se pouze uživateli, který se připojil k relaci 0. Vzhledem k tomu, že neexistuje způsob, jak zaručit, že je interaktivní uživatel připojený k relaci 0, nekonfigurujte službu tak, aby běžela jako interaktivní služba v rámci Terminálové služby nebo v systému, který podporuje rychlé přepínání uživatelů (rychlé přepínání uživatelů se implementuje pomocí Terminálové služby).