Usługi interakcyjne
Zazwyczaj usługi to aplikacje konsolowe przeznaczone do uruchamiania nienadzorowanego bez graficznego interfejsu użytkownika (GUI). Jednak niektóre usługi mogą wymagać okazjonalnych interakcji z użytkownikiem. Na tej stronie omówiono najlepsze sposoby interakcji z użytkownikiem z usługi.
Ważny
Usługi nie mogą bezpośrednio współdziałać z użytkownikiem w systemie Windows Vista. W związku z tym techniki wymienione w sekcji "Korzystanie z usługi interaktywnej" nie powinny być używane w nowym kodzie.
Interakcja z użytkownikiem z usługi pośrednio
Następujące techniki umożliwiają interakcję z użytkownikiem z usługi we wszystkich obsługiwanych wersjach systemu Windows:
Wyświetl okno dialogowe w sesji użytkownika przy użyciu funkcji WTSSendMessage.
Utwórz oddzielną ukrytą aplikację graficznego interfejsu użytkownika i użyj funkcji CreateProcessAsUser, aby uruchomić aplikację w kontekście użytkownika interaktywnego. Zaprojektuj aplikację graficznego interfejsu użytkownika, aby komunikowała się z usługą za pomocą jakiejś metody komunikacji międzyprocesowej (IPC), na przykład nazwanych potoków. Usługa komunikuje się z aplikacją graficznego interfejsu użytkownika, aby poinformować ją, kiedy ma być wyświetlany graficzny interfejs użytkownika. Aplikacja komunikuje wyniki interakcji użytkownika z powrotem z usługą, aby usługa mogła podjąć odpowiednie działania. Należy pamiętać, że protokół IPC może uwidocznić interfejsy usługi za pośrednictwem sieci, chyba że używasz odpowiedniej listy kontroli dostępu (ACL).
Jeśli ta usługa działa w systemie z wieloma użytkownikami, dodaj aplikację do następującego klucza, aby była uruchamiana w każdej sesji: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Jeśli aplikacja używa nazwanych potoków dla IPC, serwer może odróżnić wiele procesów użytkownika, dając każdemu potokowi unikatową nazwę na podstawie identyfikatora sesji.
Poniższa technika jest również dostępna dla systemów Windows Server 2003 i Windows XP:
- Wyświetl okno komunikatu, wywołując funkcję MessageBox za pomocą MB_SERVICE_NOTIFICATION. Jest to zalecane do wyświetlania prostych komunikatów o stanie. Nie należy wywoływać MessageBox podczas inicjowania usługi lub z procedury HandlerEx, chyba że wywołasz ją z oddzielnego wątku, aby powrócić do SCM w odpowiednim czasie.
Korzystanie z usługi interaktywnej
Domyślnie usługi używają nieinteraktywnej stacji okien i nie mogą wchodzić w interakcje z użytkownikiem. Jednak usługi interaktywnej może wyświetlać interfejs użytkownika i odbierać dane wejściowe użytkownika.
Ostrożność
Usługi działające w kontekście zabezpieczeń z podwyższonym poziomem uprawnień, takie jak konto LocalSystem, nie powinny tworzyć okna na pulpicie interaktywnym, ponieważ każda inna aplikacja uruchomiona na pulpicie interaktywnym może wchodzić w interakcje z tym oknem. Spowoduje to uwidocznienie usługi dla dowolnej aplikacji, która jest wykonywana przez zalogowanego użytkownika. Ponadto usługi działające jako LocalSystem nie powinny uzyskiwać dostępu do pulpitu interaktywnego przez wywołanie funkcji OpenWindowStation lub GetThreadDesktop.
Aby utworzyć usługę interaktywną, wykonaj następujące czynności podczas wywoływania funkcji CreateService:
- Określ wartość NULL parametru lpServiceStartName, aby uruchomić usługę w kontekście konta LocalSystem.
- Określ flagę SERVICE_INTERACTIVE_PROCESS.
Aby określić, czy usługa jest uruchomiona jako usługa interaktywna, wywołaj funkcję GetProcessWindowStation w celu pobrania uchwytu na stacji okien oraz funkcji GetUserObjectInformation, aby sprawdzić, czy stacja okien ma atrybut WSF_VISIBLE.
Należy jednak pamiętać, że następujący klucz rejestru zawiera wartość NoInteractiveServices, która kontroluje efekt SERVICE_INTERACTIVE_PROCESS:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
Wartość NoInteractiveServices wartość domyślna to 1, co oznacza, że żadna usługa nie może działać interaktywnie, niezależnie od tego, czy ma SERVICE_INTERACTIVE_PROCESS. Gdy NoInteractiveServices jest ustawiona na wartość 0, usługi z SERVICE_INTERACTIVE_PROCESS mogą być uruchamiane interaktywnie.
Windows 7, Windows Server 2008 R2, Windows XP i Windows Server 2003:NoInteractiveServices wartość domyślna 0, co oznacza, że usługi z SERVICE_INTERACTIVE_PROCESS mogą działać interaktywnie. Gdy noInteractiveServices jest ustawiona na wartość niezerową, nie można następnie uruchomić usługi interaktywnie, niezależnie od tego, czy ma SERVICE_INTERACTIVE_PROCESS.
Ważny
Wszystkie usługi działają w sesji 0 usług terminalowych. W związku z tym jeśli usługa interaktywna wyświetla interfejs użytkownika, jest ona widoczna tylko dla użytkownika, który nawiązał połączenie z sesją 0. Ponieważ nie ma możliwości zagwarantowania, że interakcyjny użytkownik jest połączony z sesją 0, nie należy konfigurować usługi do uruchamiania jako usługa interaktywna w ramach usług terminalowych lub w systemie, który obsługuje szybkie przełączanie użytkowników (szybkie przełączanie użytkowników jest implementowane przy użyciu usług terminalowych).