I. Dans quelle session tournent les services Windows ?

Les services Windows tournent dans la session 0 et depuis Windows Vista ils sont seuls. En effet avec Windows XP, les applications et les services Windows tournaient ensemble en session 0. Avec Windows Vista et Windows 7 ce n'est plus le cas. Néanmoins, comme les messages Windows ne peuvent pas traverser les sessions, un service Windows est désormais incapable d'afficher une interface utilisateur avec les API de base de Windows, ce qui n'était pas le cas avec Windows XP.

Pour afficher un message simple, il suffit alors d'utiliser la fonction WTSSendMessage, comme illustré dans le listing suivant :

 
Sélectionnez
void ShowMessage(LPWSTR lpszMessage, LPWSTR lpszTitle)
{
	DWORD dwSession = WTSGetActiveConsoleSessionId();
	DWORD dwResponse = 0;

	WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, dwSession,
		lpszTitle,
		static_cast<DWORD>((wcslen(lpszTitle) + 1) * sizeof(wchar_t)),
		lpszMessage,
		static_cast<DWORD>((wcslen(lpszMessage) + 1) * sizeof(wchar_t)),
		0, 0, &dwResponse, FALSE);
}

Pour des scénarios plus complexes, il faut utiliser CreateProcessAsUser.

Pour plus d'infos :