Benutzerkonten mit schneller Benutzerumschaltung und Remotedesktop
Windows XP-Benutzerkonten ermöglichen es, dass mehrere Benutzer*innen gleichzeitig angemeldet sind. Dabei sind alle mit ihren eigenen Einstellungen angemeldet und führen jeweils ihre eigenen Anwendungen aus. Benutzer*innen müssen sich nicht abmelden, um anderen Benutzer*innen den Zugriff zu ermöglichen, da mithilfe des Features für schnelle Benutzerumschaltung problemlos auf den Desktop der jeweiligen Benutzer*innen zugegriffen wird. Benutzerkonten umfassen auch das Feature für persönliche Terminalserver sowie Remotedesktop-Verbindungen, sodass Benutzer*innen über Remotesysteme auf ihre Desktopkonten zugreifen können.
Die folgenden Punkte werden erörtert:
- Anforderungen an die Infrastrukturnutzung
- Kompatibilität mit vorhandenen Anwendungen
- Registrieren für Sitzungswechselbenachrichtigungen
- Sicherstellen, dass nur eine Instanz Ihrer Anwendung ausgeführt wird
- Herunterfahren Ihrer Anwendung in allen Sitzungen
- Interaktion mit Systemdiensten
- Remotedesktop und Bandbreite
Anforderungen an die Infrastrukturnutzung
Die zugrunde liegende Infrastruktur, die von Windows 2000 geerbt wird, unterstützt die Zustandstrennung von Benutzerdaten, Benutzereinstellungen und Computereinstellungen. Wenn Sie diese Infrastruktur nutzen, ist Folgendes erforderlich, damit Sie Ihre Anwendung unter Windows XP erfolgreich ausführen können.
- Festlegen des Ordners Dokumente als Standardspeicherort für die von Benutzer*innen erstellten Daten
- Ordnungsgemäßes Klassifizieren und Speichern von Anwendungsdaten
- Ordnungsgemäßes Herunterstufen für Meldungen vom Typ „Zugriff verweigert“
Temporäre Dateien, Dateien mit Speicherzuordnung und Dokumente sollten alle im entsprechenden Unterverzeichnis des Profilverzeichnisses der Benutzer*innen gespeichert werden. Verwenden Sie SHGetFolderLocation oder SHGetFolderPath, um den geeigneten Speicherort für diese Dateien zu ermitteln. Durch das Übergeben des CSIDL_APPDATA-Flags an diese Funktionen wird der Pfad eines Dateisystemverzeichnisses zurückgegeben, das als gemeinsames Repository für anwendungsspezifische Daten dient. Verwenden Sie das CSIDL_LOCAL_APPDATA-Flag anstelle von CSIDL_APPDATA für Daten, die sich ändern sollten, wenn das Benutzerkonto gewechselt wird (z. B. temporäre Dateien).
Die oben aufgeführten Anforderungen sind ein Teil der Anforderungen im Microsoft Certification-Programm. Weitere Informationen finden Sie auf der Seite Zertifizierungsanforderungen für Windows-Desktop-Apps.
Kompatibilität mit vorhandenen Anwendungen
Sowohl bei der schnellen Benutzerumschaltung als auch bei persönlichen Terminalservern wird die Terminaldiensttechnologie verwendet, wodurch die Kompatibilität mit älteren Win32-Anwendungen von Microsoft gewährleistet wird. Wenn eine Anwendung mit einem Windows 2000-Logo kompatibel ist und grundlegende Profiltrennungs- und Energieverwaltungsfeatures implementiert werden, sollte diese Anwendung mit einzelnen Windows XP-Benutzerkonten ordnungsgemäß ausgeführt werden können.
Registrieren für Sitzungswechselbenachrichtigungen
In der Regel muss eine Anwendung nicht benachrichtigt werden, wenn ein Desktopwechsel stattfindet. Für Desktopwechselbenachrichtigungen können allerdings Anwendungen registriert werden, die benachrichtigt werden müssen, wenn das Konto, unter dem sie ausgeführt werden, der aktuelle Desktop ist (z. B. Anwendungen, die auf den seriellen Anschluss oder andere freigegebenen Ressourcen zugreifen). Verwenden Sie die WTSRegisterSessionNotification-Funktion, um sich für eine Benachrichtigung zu registrieren.
Nachdem diese Funktion aufgerufen wurde, wird das Fenster mit dem Handle hWnd registriert, um eine WM_WTSSESSION_CHANGE-Meldung über die WndProc-Funktion zu empfangen. Die Sitzungs-ID wird im lParam-Parameter gesendet, und ein Code, der das Ereignis angibt, das die Meldung generiert hat, wird in wParam als eines der folgenden Flags gesendet.
- WTS_CONSOLE_CONNECT
- WTS_CONSOLE_DISCONNECT
- WTS_REMOTE_CONNECT
- WTS_REMOTE_DISCONNECT
- WTS_SESSION_LOGOFF
- WTS_SESSION_LOGON
Anwendungen können diese Meldung verwenden, um ihren Status nachzuverfolgen sowie konsolenspezifische Ressourcen freizugeben und anzurufen. Für Benutzerdesktops kann dynamisch zwischen der Remote- und der Konsolensteuerung gewechselt werden. Anwendungen sollten für die Synchronisierung mit dem Remotverbindungsstatus oder lokalen Verbindungsstatus die WM_WTSSESSION_CHANGE-Meldung verwenden.
Wenn diese Benachrichtigungen für Ihren Prozess nicht mehr erforderlich sind oder der Vorgang beendet wird, sollte WTSUnRegisterSessionNotification aufgerufen werden, um die Registrierung der Benachrichtigung aufzuheben.
Wichtig
Für die an WTSRegisterSessionNotification übergebenen hWnd-Werte wird eine Referenzzählung durchgeführt, weshalb eine gleichwertige Anzahl von WTSUnRegisterSessionNotification-Aufrufen erforderlich ist, um sicherzustellen, dass alle zugeordneten Ressourcen freigegeben werden.
Sicherstellen, dass nur eine Instanz Ihrer Anwendung ausgeführt wird
Viele Anwendungen müssen sicherstellen, dass nur eine Instanz ausgeführt wird. Es gibt mehrere Möglichkeiten, dies unter Windows XP zu ermitteln. Im Folgenden finden Sie zwei Beispiele:
- Verwenden Sie FindWindow oder FindWindowEx, um nach einem bekannten Fenster zu suchen, das von der Anwendung geöffnet wird. Wenn dieses Fenster bereits geöffnet ist, können Sie dies als Hinweis verstehen, dass die Anwendung bereits ausgeführt wird.
- Erstellen Sie ein Mutex- oder Semaphorobjekt, wenn die Anwendung geöffnet wird, und schließen Sie dieses Objekt, wenn die Anwendung beendet wird. Der globale Objektnamespace ist für jeden Desktop getrennt, sodass jeweils eine eindeutige Liste von Mutex- und Semaphorobjekten zugelassen wird.
Herunterfahren Ihrer Anwendung in allen Sitzungen
Eine Anwendung muss sich möglicherweise in allen Sitzungen herunterfahren. Beispielsweise kann eine Anwendung, die in zwei oder mehr Sitzungen gleichzeitig ausgeführt wird, eine neue Datei aus dem Web herunterladen. Dann muss sie sich möglicherweise selbst schließen und mit den aktualisierten Bits neu starten. Dies müsste natürlich in allen laufenden Sitzungen erfolgen. Ihre Anwendung sollte so geschrieben werden, dass sie ordnungsgemäß beendet wird, wenn eine Benachrichtigung empfangen wird.
Interaktion mit Systemdiensten
Im Hinblick auf die Programmsteuerung müssen die folgenden Fälle behandelt werden.
Der Serverprozess empfängt eine direkte Anforderung von einem Clientprozess.
In diesem Fall wird die Meldung wahrscheinlich mit einem lokalen Prozeduraufruf (Local Procedure Call, LPC) oder einem Remoteprozeduraufruf (Remote Procedure Call, RPC) übertragen. Es gibt APIs für LPCs oder RPCs, die das Abrufen des Clienttokens ermöglichen. Sobald das Clienttoken abgerufen wurde, kann der Server es in einem CreateProcessAsUser-Aufruf verwenden. Dadurch wird der Prozess für die richtige Fensterstation angezeigt (unter der Voraussetzung, dass das Clientbenutzertoken über ein Sitzungstag verfügt, was der Fall sein sollte).
Hinweis
CreateProcessAsUser unterstützt derzeit keine sitzungsübergreifende Handlevererbung.
Der Serverprozess empfängt eine Benachrichtigung und muss die Benutzeroberfläche anzeigen, die Anzeige muss sich jedoch nicht im Kontext der aktuellen Benutzer*innen befinden.
In diesem Fall kann der Serverprozess sein primäres Prozesstoken duplizieren und den betreffenden Sitzungsbezeichner so ändern, dass er mit dem aktuellen Sitzungsbezeichner übereinstimmt. Der aktuelle Sitzungsbezeichner kann mithilfe der WTSGetActiveConsoleSessionId-Funktion abgerufen werden.
Hinweis
Sie benötigen die SE_TCB_PRIVILEGE-Berechtigung, um die Tokensitzungs-ID festzulegen. Sie verfügen nur bei Ausführung des Diensts in „NT AUTHORITY\SYSTEM“ über diese.
Remotedesktop und Bandbreite
Durch das Hinzufügen des Remotedesktop-Features zu Windows XP sollten Anwendungen nicht mehr Bandbreite verwenden als erforderlich, um umfangreiche Bildschirmzeichnungen und Animationseffekte zu vermeiden, wenn der Desktop remote verbunden ist. Um festzustellen, ob es sich bei der aktuellen Sitzung um eine Remotesitzung handelt, können Sie GetSystemMetrics mit SM_REMOTESESSION aufrufen. Beachten Sie jedoch, dass dieser Aufruf nicht zwischen Remoteverbindungen und getrennten Verbindungen unterscheidet.