L'exécution d'un nouveau processus en tant qu'utilisateur différent dans vb.net

Je suis actuellement en utilisant un homegrown méthode pour exécuter un processus à un autre utilisateur dans Vista, et je ne peux pas échapper au sentiment que c'hack-ish et le moins que l'idéal (en plus du fait qu'il craps contrôle de compte d'utilisateur, plantage de mon appli avec une exception de sécurité, et en me forçant à désactiver l'UAC au total). Mon processus se compose de deux projets (donc deux fichiers EXE) - une "interface" et un "lancement stub" - et voici le processus:

  1. Utilisateur dispose d'un raccourci qui lance "Interface.exe notepad.exe"
  2. Interface.exe a un formulaire qui demande les informations d'identification à utiliser
  3. Interace.exe utilise ProcessStartInfo pour créer une instance de LaunchStub.exe (LS) en tant que nouvel utilisateur
  4. LS utilise ProcessStartInfo (avec ShellExecute true) pour lancer le fichier demandé, et depuis il est déjà en cours d'exécution dans la demande de l'utilisateur, ainsi que le nouveau processus.

La raison pour laquelle j'ai un processus en deux étapes est que je veux que les utilisateurs soient en mesure de faire un clic droit sur n'importe quel fichier du système d'exploitation possède une action par défaut pour les (.EXE, .SQL, .MSC, etc) et de le lancer, et ProcessStartInfo ne supporte qu'avec "UseShellExecute" est activée, mais que le commutateur m'empêche de l'utilisation de nouvelles informations d'identification, donc je ne peut faire qu'une à la fois.

Cela provoque quelques problèmes - tout d'abord, l'utilisateur doit déjà exister sur l'ordinateur, ce qui signifie qu'ils ont à être connecté en local avant. Si il n'y a pas de profil de l'utilisateur, l'application est parfois lancer, mais je reçois de registre et les exceptions de profil, car l'application s'attend que les choses existent qui ne sont pas encore (comme un HKCU de la ruche dans le registre, que l'utilisateur n'a pas de raison qu'ils n'ont jamais connecté).

Je sais que je devrais être en mesure de simplement "Élever" les droits de ma demande à l'utilisateur qu'ils sont la demande, à lancer mon nouveau processus, puis d'annuler l'élévation, mais je ne suis pas en mesure de trouver un bon exemple de code pour ça, et je ne suis pas sûr qu'il serait de permettre l'exécution d'un programme complètement différent de l'utilisateur. Tout cela est-il un sens? J'ai juste ne peut pas aider à se sentir comme il ya une meilleure façon de le faire.


Mise à JOUR: j'ai juste essayé de certains d'emprunt d'identité de code j'ai trouvé en ligne, mais en vain. Lorsqu'il est utilisé conjointement avec ProcessStartInfo, il semble toujours de lancer des processus en utilisant ma connexion actuelle, et non pas celui que j'ai fourni, même si j'ai activé l'usurpation d'identité en utilisant les informations d'identification fournies.

OriginalL'auteur SqlRyan | 2009-01-26