J'ai une application que j'ai écrite dans .net. Il doit rester en cours d'exécution et avoir accès au bureau que la boîte de dialogue UAC est ouverte sur et interagir avec ce bureau à l'aide d'événements de clavier et de souris. p>
C'est une sorte de programme VNC. Imaginez que vous exécutez un programme VNC et une fenêtre UAC apparaît, vous souhaitez que votre programme VNC puisse toujours être capable de contrôler le bureau avec la fenêtre UAC de la fenêtre em> afin que l'utilisateur puisse déplacer la souris et cliquer Le bouton OK sur la boîte de dialogue UAC. Quelqu'un peut-il me dire comment j'allais faire ça? p>
merci p>
5 Réponses :
J'imagine que vous devez probablement être exécuté en tant que service Windows à autoriser à exécuter pendant que l'UAC est active. P>
Oui, mais courir comme un service ne suffit pas.
Le problème est que l'invite de l'UAC ne s'ouvre pas sur le bureau actuel, mais plutôt dans un tout nouveau Secure Desktop , qui suspend tout ordinateur de bureau actuellement ouvert. P>
Ceci est intentionnel, car les programmes ne sont pas autorisés à interagir avec cette boîte de dialogue. P>
Il existe une exception près: "Les processus système de confiance peuvent exécuter sur le bureau sécurisé", selon cette entrée de blog . p>
Oui, c'est correct mais il est toujours possible de faire fonctionner votre programme sur le bureau sécurisé lorsqu'une fenêtre UAC s'ouvre. Les programmes VNC le font, sinon ils seraient assez inutiles.
Eh bien, ils ne seraient pas totalement inutiles. Vous pouvez toujours éteindre l'UAC, si c'est votre machine. Gotomypc a apparemment résolu ce problème, mais je ne sais pas comment.
Désactiver l'UAC n'est en fait pas une excellente option car elle désactive une autre fonctionnalité du système d'exploitation lorsque vous le faites.
Il est exceptionnel: les processus de confiance fonctionnant lorsque l'utilisateur du système peut toujours interagir avec le bureau sécurisé.
@Ray: Il n'est pas possible pour un "mode utilisateur" d'interagir avec le winstation (Secure Desktop) affichant l'invite de l'UAC. Sinon, ces applications de mode utilisateur pourraient interagir avec l'invite UAC et "Cliquez sur" le bouton pour vous automatiquement, ce qui vaincre complètement le but d'afficher l'invite en premier lieu.
En tant que service, cela devrait être capable de. Ma candidature est signée avec un certificat aussi
Je crois que tout ce que vous voyez sur votre écran lors de l'invite UAC est une capture d'écran (à l'exception de la boîte de dialogue elle-même) p>
Il crée un nouveau bureau et utilise une capture d'écran de votre bureau comme arrière-plan, mais c'est toujours un bureau entièrement fonctionnel et d'autres programmes peuvent y faire fonctionner.
@Ray: Ce n'est pas un "bureau entièrement fonctionnel" (en fait, ce n'est même pas un ordinateur de bureau, c'est une winstation) et d'autres programmes ne peuvent pas l'exécuter car il est isolé.
Vous ne pouvez pas faire cela. Par défaut, lorsqu'une invite UAC apparaît, elle s'exécute en réalité dans une gravure isolée différente de celle qui exécute des applications "normales". Cette winstation est isolée spécifiquement pour empêcher les applications utilisateur d'interagir avec l'invite de l'UAC. Il ressemble à votre bureau car le fond de cette winstation est en fait une image bitmap statique de votre bureau tel qu'il était juste avant que l'invite UAC ait été affichée. P>
Je suppose que cela pourrait être un problème dans la version de VNC que vous exécutez car je suis assez certain que le bureau distant fournit le comportement correct et vous permet d'interagir toujours avec l'invite UAC via le client de bureau distant. Gardez à l'esprit, lors de l'exécution de n'importe quel type de client distant (Bureau distant, VNC, etc.), l'idée est que TAHT Le client devrait vous permettre de faire tout ce que vous pourriez normalement faire si vous étiez physiquement assis au clavier. p>
C'est possible. Beaucoup de programmes VNC sont capables de le faire, y compris LogMein.com.
Je vous suggérerais de commencer par lire le documentation . Je suppose que peut-être que vous pourriez peut-être ouvrir la station de fenêtre et y attacher votre processus, mais je ne connais pas ce domaine avec cette zone de Windows.
Editer 1: P>
dans Windows XP, j'ai pu Accédez au bureau sécurisé ("WinLogon") via Opensedesktop lors de l'exécution de System; L'ACL sur le bureau sécurisé permet d'accéder uniquement au compte système. Après l'avoir ouvert, je pouvais énumérer les fenêtres dessus, bien qu'il n'y ait qu'une poignée. Peut-être que vous pourriez définir un crochet de fenêtre et écouter la création de la boîte de dialogue spécifique. Je ne sais pas si Vista a changé ce modèle, alors cela ne fonctionnera peut-être pas; Je n'ai pas de machine à vista devant moi pour tester contre. P>
EDIT 2: P>
OK, j'ai eu quelque chose qui fonctionne principalement (testé sur Windows 7). Tout d'abord, vous devez avoir un service fonctionnant comme système. De ce service, vous devez lancer une application distincte dans la session de l'utilisateur. Pour ce faire, énumérer tous les processus à la recherche de WinLogon.exe, ouvrez son jeton et CreateProcessasUser. Spécifiez "WINSTA0 \ WINLOGON" pour le paramètre LPDESKTOP de STERTUPINFO. Vous avez maintenant un processus en tant que système dans la session de l'utilisateur sur le bureau "WinLogon". Dans le nouveau processus, vous pouvez faire ce que vous voulez; J'ai fait un test rapide avec Enumdesktopwindows et j'ai pu obtenir la classe de fenêtre et le texte pour divers Windows liés à l'UAC ("Windows" $$$ Secure UAP Funnd Window "," $$$ sécurisé UAP Fond de fausse fenêtre client ", etc.). Je ne sais pas comment déterminer quand une invite de l'UAC est affichée, cependant; En tant que piratage rapide, vous pouvez simplement exécuter une boucle toutes les 100 ms à la recherche de Windows UAC ou quelque chose. Je pourrais coller du code si cela vous aiderait. P>
Edit 3: P>
OK. J'ai écrit un service Win32 qui prend les paramètres suivants: P>
/ installer - installe le service
/ Désinstallation - Désinstalle le service
/ service - fonctionne comme un service; invoqué via SCM
/ client - fonctionne comme client; Invoqué via CreateProcessasUser P>
Le seul code intéressant est dans les modes / services et / clients. p>
in / service, il énumère les processus d'exécution via Enumprocesses et GetModuleFilenameEx à la recherche de "WinLogon.exe ". Lorsqu'il en trouve un, il ouvre son jeton et se lance en mode / en mode client via CreateProcessasUser: P> in / client, clique sur le bouton "Oui" de l'invite UAC via un BUNCH D'appels FINDWINDOW et FINDWINDOWEX. Vous pouvez utiliser SPY ++ pour comprendre la hiérarchie de la fenêtre. P> HWND hWnd = ...;
HWND hWndButton = FindWindowEx(hWnd, NULL, _T("Button"), NULL);
if(hWndButton != NULL)
{
// see if this is the "Yes" button
TCHAR szText[32];
if(GetWindowText(hWndButton, szText, 32) && _tcsicmp(szText, _T("&Yes")) == 0)
{
// click it
SendMessage(hWndButton, BM_CLICK, 0, 0);
}
}
Merci pour le code. Tout intérêt à travailler sur cela pour moi sur une base contractuelle?
J'ai eu ceci compilé et exécuté dans vb.net. Chaque étape revient vrai, mais je reçois un identifiant de processus de zéro dans "ProcessInformation", même si la fonction retourne vrai, il ne semble donc pas créer le processus. Lorsque cela fonctionne, je verrai-je littéralement la fenêtre à mon application montrant sur mon écran de connexion Windows? Dois-je être sur l'écran de connexion quand je courais ça? L'exécute sur le bureau WinLogon de la même manière que l'exécuter sur le bureau que la fenêtre de l'UAC apparaît? Tous les conseils que vous pouvez fournir seraient appréciés. Merci!
Cela fait si longtemps que je ne me souviens pas vraiment des détails. Si je me souviens bien, je crois que cela ressortait sur le même bureau que l'invite de l'UAC apparaît. Je pense que je l'ai testé en exécutant Regedit, qui est manifesté pour qu'il montre toujours l'invite de l'UAC. Une fois sur le bureau de l'UAC, vous pouvez l'onglet Alt + sur l'autre application.
@Luke: Votre message est très utile! Souhaitez-vous fournir le code complet pour ce service?
Je suis sûr que je ne l'ai plus, désolé.
Non, la souris et le clavier ne fonctionnent pas car mon application est toujours en cours d'exécution sur le bureau d'origine et que la fenêtre UAC est sur un bureau sécurisé, que mon programme n'a pas accès à. Je dois être capable de trouver ce bureau sécurisé puis exécutez mon programme dessus.
Si vous pouviez le faire, cela ne le ferait pas un bureau sécurisé, serait-ce ...;)