Ich habe eine Anwendung, die ich in .NET geschrieben habe. Es muss weiter ausgeführt werden und Zugriff auf den Desktop haben, auf dem sich die UAC-Dialogfenster öffnen und über Tastatur- und Mausereignisse mit diesem Desktop interagieren.
Es ist wie ein VNC-Programm. Stellen Sie sich vor, Sie führen ein VNC-Programm aus und ein UAC-Fenster erscheint. Sie möchten, dass Ihr VNC-Programm den Desktop mit dem darin enthaltenen UAC-Fenster weiterhin steuern kann, damit der Benutzer die Maus bewegen und klicken kann Klicken Sie im Dialogfeld Benutzerkontensteuerung auf die Schaltfläche OK. Kann mir jemand sagen, wie ich das machen würde?
Danke
Ich würde vorschlagen, dass Sie mit dem Lesen der Dokumentation beginnen. Ich würde vermuten, dass Sie vielleicht die Fensterstation öffnen und Ihren Prozess anhängen könnten, aber ich kenne diesen Bereich von Windows nicht sehr gut.
Bearbeiten 1:
Unter Windows XP konnte ich über OpenDesktop auf den sicheren Desktop ("winlogon") zugreifen, wenn ich als SYSTEM liefere; Die Zugriffssteuerungsliste auf dem sicheren Desktop ermöglicht nur den Zugriff auf das Konto SYSTEM. Nach dem Öffnen konnte ich die Fenster aufzählen, obwohl es nur eine Handvoll gab. Vielleicht könnten Sie einen Fensterhaken setzen und auf die Erstellung des spezifischen Dialogs warten. Ich bin mir nicht sicher, ob Vista dieses Modell geändert hat, also wird es vielleicht nicht funktionieren; Ich habe keine Vista-Maschine vor mir zum Testen.
Bearbeiten 2:
Ok, ich habe etwas, das meistens funktioniert (getestet unter Windows 7). Zuerst muss ein Dienst als SYSTEM ausgeführt werden. Von diesem Dienst müssen Sie eine separate Anwendung in der Benutzersitzung starten. Zählen Sie dazu alle Prozesse auf, die nach winlogon.exe, seinem Token und CreateProcessAsUser suchen. Geben Sie "WinSta0 \ Winlogon" für den Parameter lpDesktop von STARTUPINFO an. Jetzt läuft in der Sitzung des Benutzers auf dem "Winlogon" -Desktop ein Prozess als SYSTEM. Im neuen Prozess können Sie tun, was Sie wollen; Ich habe einen schnellen Test mit EnumDesktopWindows gemacht und konnte die Fensterklasse und den Text für verschiedene UAC-bezogene Fenster ("$$$ Secure UAP-Hintergrundfenster", "$$$ Secure UAP-Hintergrund-Fake-Client-Fenster" usw.) abrufen. Ich bin mir nicht sicher, wie ich feststellen kann, wenn eine UAC-Eingabeaufforderung angezeigt wird. Als einen schnellen Hack könnte man alle 100 ms eine Schleife laufen lassen, um nach UAC-Fenstern oder so etwas zu suchen. Ich könnte etwas Code einfügen, wenn es helfen würde.
Bearbeiten 3:
Ok. Ich habe einen Win32-Dienst geschrieben, der die folgenden Parameter verwendet:
/ install - installiert den Service
/ uninstall - deinstalliert den Service
/ service - läuft als Dienst; aufgerufen über SCM
/ Client - läuft als Client; aufgerufen über CreateProcessAsUser
Der einzige interessante Code ist in den Modi / service und / client.
Im Service-Modus werden die laufenden Prozesse über EnumProcesses und GetModuleFileNameEx nach "winlogon.exe" aufgelistet. Wenn es einen findet, öffnet es sein Token und startet sich im / Client-Modus über CreateProcessAsUser:
%Vor%Im / Client-Modus klickt es auf die "Ja" -Schaltfläche in der UAC-Eingabeaufforderung über eine Reihe von FindWindow und FindWindowEx Aufrufen. Sie können Spy ++ verwenden, um die Fensterhierarchie herauszufinden.
%Vor%Die Art, wie ich das teste, ist, einen Schlaf (5000) zu halten; im / Client-Code. Dann starte ich den Dienst und mache sofort etwas, das eine UAC-Eingabeaufforderung auslöst (d. H. Regedit). Nach 5 Sekunden wird der / Client-Code aktiviert und der "Ja" -Knopf wird gefunden und geklickt. Sie können andere Prozesse auf dem Winlogon-Desktop ausführen. cmd.exe und spyxx.exe (Spy ++) sind am nützlichsten. Leider zeigt explorer.exe viele Probleme beim Ausführen auf dem Winlogon-Desktop und ist nicht sehr nützlich. Um zum Winlogon-Desktop zu gelangen, können Sie regedit ausführen und dann Alt + Tab, um zu der anderen Anwendung zu wechseln. Wenn Sie sich etwas einfallen lassen möchten, können Sie Ihr eigenes Desktop-Switching-Dienstprogramm schreiben (mit der SwitchDesktop-Funktion), sodass Sie keine UAC-Eingabeaufforderung auslösen müssen, um zum Winlogon-Desktop zu gelangen. Wenn Sie wirklich schick werden möchten, können Sie einen globalen Fensterhaken zum Überwachen der Fenstererstellung festlegen; Wenn der UAC-Dialog angezeigt wird, können Sie sich darauf vorbereiten, auf die Schaltfläche "Ja" zu klicken. Ich habe es jedoch nicht ganz so weit genommen.
Das Problem ist, dass die UAC-Eingabeaufforderung nicht auf dem aktuellen Desktop geöffnet wird, sondern in einem komplett neuen Secure Desktop , der alle derzeit geöffneten Desktops aussetzt.
Dies ist beabsichtigt, da Programme nicht mit diesem Dialog interagieren dürfen.
Es gibt eine Ausnahme: "Vertrauenswürdige SYSTEM-Prozesse können auf dem sicheren Desktop ausgeführt werden", so dieser Blogeintrag .
Ich würde mir vorstellen, dass Sie wahrscheinlich als Windows-Dienst ausgeführt werden müssen, um während der UAC aktiv sein zu dürfen.
Sie können das nicht tun. Wenn eine UAC-Eingabeaufforderung angezeigt wird, wird sie normalerweise in einer isolierten WinStation ausgeführt, die sich von der unterscheidet, die "normale" Anwendungen ausführt. Diese WinStation ist speziell isoliert, um zu verhindern, dass Benutzeranwendungen mit der UAC-Eingabeaufforderung interagieren. Es sieht wie Ihr Desktop aus, da der Hintergrund dieser WinStation tatsächlich ein statisches Bitmap-Bild Ihres Desktops ist, wie es kurz vor der UAC-Eingabeaufforderung angezeigt wurde.
Ich vermute, dass dies ein Problem in der Version von VNC sein könnte, die Sie ausführen, da ich ziemlich sicher bin, dass der Remotedesktop das richtige Verhalten bietet und Ihnen ermöglicht, weiterhin mit der UAC-Eingabeaufforderung über den Remotedesktopclient zu interagieren. Denken Sie daran, wenn Sie irgendeine Art von Remote-Client (Remote-Desktop, VNC, etc.) ausführen, ist die Idee, dass der Client Ihnen erlauben sollte, alles zu tun, was Sie normalerweise tun könnten, wenn Sie physisch an der Tastatur sitzen würden. p>