Au début d'un processus avec des références à partir d'un Service Windows
J'ai un service Windows qui s'exécute en tant que mydomain\user. Je veux être en mesure d'exécuter arbitraire .exe à partir du service. Normalement, j'utilise du Processus.Start() et il fonctionne très bien, mais dans certains cas, je veux lancer l'exécutable en tant qu'utilisateur différent (mydomain\userB).
Si je change le ProcessStartInfo-je utiliser pour démarrer le processus pour inclure des informations d'identification, je commence à avoir des erreurs - une boîte de dialogue d'erreur qui dit que "L'application n'a pas réussi à s'initialiser correctement (0xc0000142). Cliquez sur OK pour fermer l'application.", ou un "Accès refusé" Win32Exception. Si je lance le processus de démarrage de code à partir de la ligne de commande au lieu de l'exécuter dans le service, le processus commence à utiliser les informations d'identification correctes (j'ai vérifié en mettant l'ProcessStartInfo à exécuter whoami.exe et la capture de la sortie de ligne de commande).
J'ai aussi essayé d'usurpation d'identité à l'aide de WindowsIdentity.Usurper l'identité d'(), mais cela n'a pas fonctionné comme je le comprends, l'usurpation d'identité n'affecte que le thread en cours, et de commencer un nouveau processus hérite du processus de descripteur de sécurité, ne pas le thread courant.
Je suis en cours d'exécution dans un test isolé de domaine, si bien que l'utilisateur a et utilisateur b sont les admins du domaine, et les deux ont la session en tant que Service de droit à l'échelle du domaine.
- Est-il Vista OS? T-il se passer lorsque vous lancez Notepad.exe ainsi?
- Pouvez-vous mettre un exemple de code de vos arguments?
- Désolé, je n'ai pas été en mesure de revenir à vous plus tôt. Si vous avez encore besoin d'un exemple de code que j'ai édité ma réponse pour ajouter un lien vers un article que j'ai récemment publié avec le code source.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous lancez un nouveau processus à l'aide de ProcessStartInfo le processus est lancé dans la même fenêtre de la station et bureau en tant que le processus de lancement. Si vous utilisez des informations d'identification de l'utilisateur, en général, pas de droits suffisants pour exécuter dans ce bureau. L'échec d'initialisation erreurs sont causées par user32.dll tentatives d'initialisation dans le nouveau processus et ne le peuvent pas.
Pour contourner ce problème, vous devez d'abord récupérer les descripteurs de sécurité associé à la fenêtre de la gare et du bureau et ajouter les autorisations appropriées à la DACL pour votre utilisateur, puis lancer votre processus en vertu de ces nouvelles informations.
EDIT: UNE description détaillée sur la façon de faire et des exemples de code était un peu long pour ici, donc j'ai mis en place un l'article avec code.
Basé sur la réponse par @StephenMartin.
Un nouveau processus lancé à l'aide de la
Process
classe fonctionne dans la même fenêtre de la station et bureau en tant que le processus de lancement. Si vous exécutez le nouveau processus à l'aide d'informations d'identification différentes, alors le nouveau processus n'avez pas les permissions pour accéder à la fenêtre de la station et bureau. Quels sont les résultats sur les erreurs comme 0xC0000142.Ce qui suit est un "compact" autonome code pour accorder à un utilisateur un accès à la fenêtre actuelle de la station et bureau. Il ne nécessite pas la AsproLock bibliothèque.
Appeler le
GrantAccessToWindowStationAndDesktop
méthode avec le nom d'utilisateur que vous utilisez pour exécuter leProcess
(Process.StartInfo.UserName
), avant d'appelerProcess.Start
.En fonction de la réponse par @Stephen Martin et Martin Prikryl.
Ce code vous permet d'exécuter un processus avec différents identifiants de l'utilisateur à partir d'un service.
J'ai maintenant optimisé le code source.
L'enlèvement et la fixation des droits est désormais également possible.
Échantillon À L'Aide De
Merci.
Ceci est symptomatique de :
- l'insuffisance des droits;
- l'échec de la charge d'une bibliothèque;
Utiliser Filemon pour détecter des refus d'accès ou
WinDbg pour lancer l'application dans un débogueur et afficher n'importe quel problème.
J'ai ré-implémenté Martin Prikryl réponse en Python, qui, je l'espère, quelqu'un la trouve utile.
Je suis tombé sur ce problème de l'exécution d'un sous-processus dans un script Python. J'ai été en utilisant le
pythonnet
package pour exécuterSystem.Diagnostics.Process
en tant qu'utilisateur différent. Mon problème était que le sous-processus n'était pas en cours d'exécution et je n'ai reçu aucune stdout ou stderr.J'ai utilisé Martin Prikryl réponse, mais je ré-implémenté en Python à l'aide de la pyWin32 de la bibliothèque, qui a résolu mon problème.:
Comment vous mettez-vous le domaine, l'utilisateur et le mot de passe? Êtes-vous définissant le domaine correctement ainsi que le mot de passe (il doit utiliser un SecureString).
Aussi, êtes-vous du réglage de l'WorkingDirectory propriété? Lors de l'utilisation d'un nom d'utilisateur et le Mot de passe, la documentation indique que vous devez définir la WorkingDirectory propriété.
Il se peut que tout le processus a débuté par un service doit également avoir le "ouvrir une session en tant que Service" privelege.
Si l'id utilisateur que vous utilisez pour démarrer le deuxième processus n'a pas les droits d'administration de la box, cela pourrait être le cas.
Un moyen simple serait de modifier la stratégie de sécurité locale pour donner le nom d'utilisateur "ouvrir une session en tant que service" et essayez à nouveau.
Edit: d'Après les informations supplémentaires..
Pâturage sur Google, sur ce point, il semble que 0xc0000142 se rapporte à ne pas être en mesure d'initialiser une DLL. Il y a une chose que le service a ouvert que le processus générés dynamiquement besoins? En tout cas, on dirait qu'il a à faire avec le processus qui a débuté, et non pas comment vous le faites.
J'ai eu ce problème aujourd'hui, et j'ai passé assez de temps à essayer de le comprendre. Ce que j'ai fait a été de créer un service interactif (à l'aide d'Autoriser le service à interagir avec le bureau de case à cocher dans les services.msc). Dès que je n'ai que la 0xc0000142 erreurs s'en alla.