Pourquoi est-ce processus s'écraser dès qu'il est lancé?
Nous avons un IIS service WCF qui lance un autre processus (app.exe) en tant qu'utilisateur différent. J'ai un contrôle complet sur les deux applications (et c'est un environnement de dev pour l'instant). Le pool d'applications IIS s'exécute comme moi, un utilisateur de domaine (DOMAIN\nirvin), qui est aussi un administrateur local sur la boîte. Le deuxième processus est censé exécuter en tant qu'utilisateur local (svc-bas). Je suis à l'aide de System.Diagnostics.Process.Start(ProcessStartInfo)
pour lancer le processus. Le processus démarre avec succès - je le sais parce que il n'y a pas les exceptions levées, et je reçois un ID de processus. Mais le processus meurt immédiatement, et j'obtiens une erreur dans le Journal des Événements qui ressemble à:
Défaillant nom de l'application: app.exe version: 1.0.3.0, horodatage: 0x514cd763
Nom du module défaillant: KERNELBASE.dll version: 6.2.9200.16451, horodatage: 0x50988aa6
Code d'Exception: 0xc06d007e
Décalage d'erreur: 0x000000000003811c
Processus défaillant id: 0x10a4
Application défaillante heure de début: 0x01ce274b3c83d62d
Défaillant chemin de l'application: C:\Program Files\company\app\app.exe
Chemin d'accès du module défaillant: C:\Windows\system32\KERNELBASE.dll
Id de rapport: 7a45cd1c-933e-11e2-93f8-005056b316dd
Package défaillant nom complet:
Défaillant relatif au package de l'application ID:
J'ai assez approfondie de l'exploitation forestière dans app.exe (maintenant), donc je ne pense pas qu'il jette les erreurs dans la .NET code (ou plus).
Voici la vraie odieux partie: j'ai pensé que j'étais juste de lancer le processus de mal, alors j'ai copié mon Process.Start()
appel à un muet application WinForms et il a couru sur la machine que moi-même, en espérant que de bricoler autour jusqu'à ce que je suis les paramètres de droite. Alors, bien sûr, qui a fonctionné la première fois, et à chaque fois depuis que je suis en mesure de toujours lancer le deuxième processus et l'exécuter comme prévu. C'est seulement le lancement à partir de IIS qui ne fonctionne pas.
J'ai essayé de donner svc-faible autorisation d'ouvrir une session en tant que tâche" et j'ai essayé de me donner la permission de "Remplacer un jeton de niveau processus" (dans la Stratégie de Sécurité Locale), mais ils ne semblent avoir fait toute la différence.
Aider!
Détails De L'Environnement
- Windows Server 2012
- .NET 4.5 (toutes les applications mentionnées)
Des Détails Supplémentaires
Au premier app.exe est une Application de Console. En essayant de lancement a été prise conhost.exe générer des erreurs dans le Journal des Événements, donc je suis passé app.exe pour être une Application Windows. Qui a eu conhost de l'équation, mais m'a laissé la situation décrite ici. (Visite guidée en bas de ce chemin par cette question.)
La ProcessStartInfo
objet-je utiliser ressemble à ceci:
new ProcessStartInfo
{
FileName = fileName,
Arguments = allArguments,
Domain = domainName,
UserName = userName,
Password = securePassword,
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = false
//LoadUserProfile = true //I've done it with and without this set
};
Une question existante dit que je doit aller vers le bas de l'API native, mais que la question répond à une situation différente, et b) le succès de la muette WinForms app suggère que Process.Start
est un choix viable pour l'emploi.
Il pourrait être la peine d'essayer une app.exe c'est complètement vide, afin d'écarter tout le code à l'intérieur.
Pour ce que ça vaut le coup de cette exception, le code s'affiche dans le sens de "module non trouvé". Si c'était moi, je serais probablement exécuter le Moniteur de Processus (Russinovich et al) pour avoir une idée de ce que l'application est en train d'essayer de charger.
Ces module introuvable erreurs finissent souvent dans le journal des événements d'application. Ils ont même vous dire ce module n'a pas été trouvé.
Ouais il sorte de se sent comme un problème de chemin d'accès, d'accord sysinternals est le chemin à parcourir.
OriginalL'auteur nateirvin | 2013-03-22
Vous devez vous connecter pour publier un commentaire.
J'ai fini par l'ouverture d'un cas avec Microsoft, et c'est l'information que j'ai été donné:
(c'est le mot à mot de l'ingénieur de support; c'est moi qui souligne)
Ils m'a recommandé d'utiliser
CreateProcessAsUser
à la place. Ils m'ont donné quelques exemples de code, que j'ai ensuite adapté à mes besoins, et maintenant tout fonctionne très bien!Le résultat final était:
Il y a quelques pré-requis à la réalisation de ce travail de code. L'utilisateur doit avoir le droit de l'utilisateur à "Remplacer un jeton de niveau processus" et "Ajuster les quotas de mémoire pour un processus", tandis que l'autre utilisateur doit avoir le droit de l'utilisateur à "ouvrir une session en tant que tâche'. Ces réglages peuvent être trouvés sous la Stratégie De Sécurité Locale (ou éventuellement par le biais de la Stratégie de Groupe). Si vous les modifiez, un redémarrage sera nécessaire.
UserToken
est une propriété qui peut être fermé parReleaseUserToken
parce que nous appelleronsStartProcess
à plusieurs reprises et nous ont dit de ne pas le journal de l'autre utilisateur sur encore et encore.Que
SecureStringToString()
méthode a été prise à partir de cette question. À l'aide deSecureString
ne faisait pas partie de Microsoft recommandation; j'ai fait de cette façon afin de ne pas casser la compatibilité avec d'autres codes.Oui, ce code a été en cours d'exécution dans la production sous très haute charge sans erreurs depuis la fin Mai 2013.
Par la façon dont, plus tard, je n'ai modifier ce code un peu, comme documenté par cette SORTE de question (assurez-vous de lire les commentaires): stackoverflow.com/questions/23687015/...
Est-il une raison pour laquelle vous avez utilisé le
W
ide (Unicode) appel de méthode pour leLogonUser
appel et laA
nsi appel de méthode pour le createprocess appel?il a été un moment, donc je ne me souviens pas pour vous, mais je suis assez sûr que j'ai juste utilisé les appels à la méthode recommandée par l'ingénieur de Support Microsoft. Le code ci-dessus a ensuite été étendu à la capture de la sortie standard, et prendre un certain temps pour obtenir le droit, mais le code n'était pas trop horrible (voir question)
OriginalL'auteur nateirvin
C'est une exception qui est spécifique à Microsoft Visual C++, le code 0x6d. Le code d'erreur est 0x007e (126), ERROR_MOD_NOT_FOUND, "Le module spécifié est introuvable". Cette exception est générée lorsqu'un retard-chargement des DLL ne peut être trouvée. La plupart des programmeurs ont le code qui génère cette exception sur leur machine, vc/include/delayhlp.cpp dans le répertoire d'installation de Visual Studio.
Bien, c'est le type "fichier non trouvé" mésaventure, en fonction d'une DLL. Si vous n'avez aucune idée de ce que DLL est manquant, vous pouvez utiliser SysInternals' ProcMon utilitaire. Vous verrez le programme de recherche de la DLL et de ne pas trouver juste avant les bombes.
Une manière classique pour obtenir mal conçu blocage de programmes et le Processus.Start() est par définition pas le ProcessStartInfo.WorkingDirectory propriété du répertoire dans lequel le fichier EXE est stocké. C'est souvent par hasard, mais ne seront pas lorsque vous utilisez la classe de Processus. N'a pas l'air de vous faire attaquer en premier.
ProcessStartInfo.WorkingDirectory
ne change rien pour moi. Reflétant à traversSystem.Diagnostic.Process
me dit que lorsque cette valeur n'est pas définie .NET va utiliserEnvironment.CurrentDirectory
. Est-il spécifique répertoire de travail que vous pensez que je dois être la définition de la valeur?Même que si l'EXE est situé. Avez-vous trouvé la DLL? Si vous n'avez pas la moindre idée alors assurez-vous de communiquer avec le propriétaire de l'appui du programme.
Je suis le propriétaire du programme. Je n'ai pas été en mesure de voir toutes les erreurs par le biais de ProcMon: en fait, elle dit que c'est le chargement KERNELBASE.DLL fine et je ne vois pas d'autre LoadImage erreurs.
Non, il n'est pas kernelbase.dll et vous ne voyez pas "LoadImage erreurs". Vous le verrez à la recherche d'un fichier et de ne pas la trouver. Si vous êtes le propriétaire de ce programme, puis vous vous rappelez certainement l'aide de l'éditeur de liens /delayload de l'option?
Le Moniteur de processus n'NOM de rapport NON TROUVÉ pour plusieurs Dll lorsque le processus échoue. Cependant, les rapports de ces mêmes événements d'erreur lorsque le processus fonctionne exactement comme souhaité. Le programme est écrit en C#.NET, donc je n'ai pas travaillé directement avec l'éditeur de liens, je suis juste bâtiment par le biais de Visual Studio. Je ne suis pas le chargement des Dll lors de l'exécution dans mon propre code .NET certainement peut-être sous le capot. Je vais rechercher le
/delayload
option pour voir si Visual Studio est de l'utiliser.OriginalL'auteur Hans Passant