2010-11-23 10 views
3

Visual C++ 2008OpenInputDesktop() Sichere/Login Desktop

zu bestimmen, wie festzustellen, ob die momentan interaktiven Benutzer sind entweder an dem Locked-Desktop (Windows-Key L) oder der Shutdown-Bildschirm (Vista oder 7) Warten auf das Schließen von Programmen beim Abmelden.

HDESK hd = OpenInputDesktop (0, falsch, READ_CONTROL);

Dies funktioniert gut für eine Benutzeranwendung auf dem Standarddesktop, schlägt aber mit Fehlercode 5 bei den gesperrten oder heruntergefahrenen Desktops fehl, da der Benutzer keine Berechtigungen zum Öffnen des sicheren Desktopobjekts hat.

Das Aufrufen von einem Dienst, der unter dem Konto SYSTEM ausgeführt wird, gibt Fehler 1 (ungültige Funktion) zurück. Ich glaube, dass der Dienst in jedem Fall in der falschen Sitzung (Sitzung 0) ist und den interaktiven Desktop für keine andere Sitzung ermitteln kann.

Ich habe eine App unter dem derzeit interaktiven Benutzer ausgeführt, und auch, der Systemdienst ausgeführt, so könnte der Code von beiden.

Sollte ich vielleicht versuchen, alle Sitzungen, Fensterstationen und Desktops aufzuzählen?

Wie kann ich den derzeit interaktiven Desktop ermitteln, wenn ich den Aufruf von OpenInputDesktop nur vom SYSTEM-Dienst in Sitzung 0 ausführen kann?

+0

Vielleicht wäre die Antwort, irgendwie zu überwachen, wenn der Benutzer Desktops wechselt? Ist das möglich? – Peter350

Antwort

3

Ich denke, man diese Methoden versuchen:

  • Von einem Prozess in derzeit interaktive Benutzer ausgeführt wird:
    Verwenden WTSRegisterSessionNotification für die Sitzungsänderungsbenachrichtigungen zu registrieren. Nach der Registrierung würde der interaktive Prozess Anmelde-/Abmeldebenachrichtigungen erhalten. Weitere Informationen finden Sie hier:
    http://msdn.microsoft.com/en-us/library/aa383841.aspx
    http://blogs.msdn.com/b/oldnewthing/archive/2006/01/ 04/509194.aspx

  • von einer Dienstleistung (läuft in Sitzung 0):
    • Verwenden GetProcessWindowStation den aktuellen Sender Griff Service zu erhalten, und sie zur späteren Verwendung speichern.
    • Verwenden Sie WTSGetActiveConsoleSessionId, um Sitzungs-ID der aktuellen interaktiven Sitzung abzurufen.
    • Den Stationsnamen entsprechend der aktuellen Sitzungs-ID mit WTSQuerySessionInformation mit WTSWinStationName Info-Klasse abrufen.
    • Öffnen Sie diese Station mit OpenWindowStation. Stellen Sie diese Station mit SetProcessWindowStation auf Ihren Service-Prozess ein.
    • Jetzt können Sie OpenInputDesktop verwenden, um zu überprüfen, ob der Benutzer angemeldet ist oder nicht.
    • Schließen Sie die geöffnete interaktive Fensterstation, indem Sie CloseWindowStation anrufen. Setzen Sie die ursprüngliche Dienststation des Fensters zurück, indem Sie SetProcessWindowStation mit zuvor gespeicherter Station-Kennung aufrufen.

PS: Derzeit "WinSta0" ist die einzige interaktive Station in Windows.So können Sie WTSGetActiveConsoleSessionId und WTSQuerySessionInformation Anrufe überspringen.

+0

Ich glaube nicht, dass die zweite Methode richtig funktioniert. Ein Dienst, der in Sitzung 0 ausgeführt wird, schlägt SetProcessWindowStation() fehl, um Winsta0 in Sitzung1 für mich festzulegen. Weil die Fensterstation auf SetProcessWindowStation() der aktuellen Sitzung zugeordnet werden muss. – sMiLo

1

Vorsicht: MSDN über WTSQuerySessionInformation mit WTSWinStationName:

Hinweis: Trotz seines Namens, diese Art Angabe nicht wieder das Fenster Stationsnamen. Stattdessen wird der Name der Remotedesktopdienste-Sitzung zurückgegeben. Jede Remotedesktopdienste-Sitzung ist einer interaktiven Fensterstation zugeordnet. Da derzeit der einzige unterstützte Name einer Fensterstation für eine interaktive Fensterstation "WinSta0" ist, ist jeder Sitzung eine eigene Fensterstation "WinSta0" zugeordnet. Weitere Informationen finden Sie unter Fensterstationen.