Warum ist dieser Prozess abstürzt, sobald es gestartet wird?
Wir haben einen IIS WCF-Dienst, dass ein weiterer Prozess gestartet wird (app.exe) als ein anderer Benutzer. Ich habe die vollständige Kontrolle über beide Programme (und das ist eine dev-Umgebung für jetzt). Der IIS-app-pool läuft, da mir ein domain user (DOMAIN\nirvin), der auch ein lokaler administrator auf der Kiste. Der zweite Prozess laufen soll als lokaler Benutzer (svc-low). Ich bin mit System.Diagnostics.Process.Start(ProcessStartInfo)
um den Vorgang zu starten. Der Prozess startet erfolgreich - ich weiß, da gibt es keine Ausnahmen, und ich bekomme eine Prozess-ID. Aber der Prozess stirbt sofort, und ich bekomme eine Fehlermeldung in das Ereignisprotokoll sieht so aus:
Name der fehlerhaften Anwendung: app.exe, version: 1.0.3.0, Zeitstempel: 0x514cd763
Fehlgeschlagenes Modul name: KERNELBASE.dll version: 6.2.9200.16451, Zeitstempel: 0x50988aa6
Ausnahmecode: 0xc06d007e
Fehleroffset: 0x000000000003811c
Fehlgeschlagene Prozess-id: 0x10a4
Fehlgeschlagene Anwendung Startzeit: 0x01ce274b3c83d62d
Fehlgeschlagene Anwendung Pfad: C:\Program Files\company\app\app.exe
Fehlgeschlagenes Modul Pfad: C:\Windows\system32\KERNELBASE.dll
Berichts-Id: 7a45cd1c-933e-11e2-93f8-005056b316dd
Fehlgeschlagene Paket voller name:
Fehlgeschlagene Paket-relativen Anwendungs-ID:
Habe ich ziemlich Gründliche Protokollierung in app.exe (jetzt), also ich glaube nicht, es wirft Fehler in der .NET-code (mehr).
Hier ist das echt widerlich Teil: ich dachte, ich war nur die Einleitung der Prozess falsch ist, so kopierte ich meine Process.Start()
rufen Sie in einen stummen WinForms app und es lief auf der Maschine selbst, in der Hoffnung, basteln herum, bis ich habe die Parameter von rechts. So natürlich gearbeitet, dass das erste mal und jedes mal, seit: ich bin in der Lage, konsequent Start des zweiten Prozesses und haben es wie vorgesehen ausgeführt. Es ist nur der Start von IIS, die nicht funktioniert.
Ich habe versucht, geben svc-low-Berechtigung "Anmelden als ein batch Auftrag" und ich habe versucht, mir die Berechtigung "Ersetzen eines Tokens auf Prozessebene" (in der Lokalen Sicherheitsrichtlinie), aber weder scheinen machte keinen Unterschied.
Hilfe!
Umgebung Details
- Windows Server 2012
- .NET 4.5 (alle genannten Anwendungen)
Weitere Details
Zuerst app.exe war eine Konsolenanwendung. Versuchen, zu starten war conhost.exe Fehler im Event-Log, also habe ich umgeschaltet app.exe eine Windows-Anwendung. Das hat conhost aus der Gleichung heraus, sondern ließ mich die situation hier beschrieben. (Geführt auf diesem Weg durch diese Frage.)
Den ProcessStartInfo
Gegenstand den ich benutze sieht wie folgt aus:
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
};
Eine vorhandene Frage sagt, ich sollte gehen, um die native API, aber a) diese Frage befasst sich eine andere situation und b) der Erfolg der dumme WinForms app deutet darauf hin, dass Process.Start
ist eine gute Wahl für den job.
- Haben Sie versucht, einen einfacheren Fall läuft das Kind, wie die gleichen (domain-admin) - account?
- Es könnte einen Versuch Wert sein, eine app.exe das ist völlig leer, um auszuschließen, alle Codes drin.
- Für was es Wert ist, die Ausnahme-code scheint zu bedeuten 'Modul nicht gefunden'. Wenn diese waren mir, ich würde wahrscheinlich ausführen " Process Monitor (Russinovich et al) um eine Idee zu bekommen, wie die Applikation zu laden versucht.
- Diese Modul nicht gefunden Fehler oft am Ende in das Ereignisprotokoll der Anwendung. Sie auch sagen, was Modul wurde nicht gefunden.
- Ja es Art von fühlt sich wie ein Pfad problem, vereinbaren sysinternals ist der Weg zu gehen.
- Also ich bin mir ziemlich sicher, dass es ist nicht ein Pfad problem - der Weg falsch war, einmal vor, und
Process.Start()
wirft eine ziemlich spezifische Ausnahme in diesem Fall. Ich werde überprüfen, wenn. Ich habe versucht, läuft bei mir wie die app-pool und das 'Kind', und das funktioniert für dev, aber es wird nicht Fliegen in der Produktion - am besten wäre es riskant sein, und im schlimmsten Fall wäre es geradezu abgelehnt, die durch unser security team. - guter Gedanke: ich habe jetzt versucht, dass ich erstellt ein "Hallo Welt" win forms .NET 4.5 app.exe dass Referenzen nur für System und funktioniert so ziemlich nichts. Ich bekomme immer noch die gleiche Fehlermeldung in das Ereignisprotokoll. Es fühlt sich an wie es gibt einige, resource(s) svc-low nicht zugreifen, aber ich kann nicht herausfinden, was.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Landete ich öffnen einen Fall von Microsoft und dies ist die Informationen, die ich erhielt:
(das ist wörtlich aus dem support-engineer; Hervorhebung von mir)
Empfohlen, ich benutze
CreateProcessAsUser
statt. Sie gab mir einige nützliche Beispiel-code, die ich dann angepasst an meine Bedürfnisse, und jetzt funktioniert alles Super!!!Das Ergebnis war dieses:
Gibt es einige Voraussetzungen, um zu machen, dieser code funktioniert. Die Benutzer ausführen, es muss das Benutzerrecht "Ersetzen eines Tokens auf Prozessebene" und "Anpassen von Speicherkontingenten für einen Prozess", während die "anderen user" haben muss das Benutzerrecht Log on as a batch job". Diese Einstellungen können gefunden werden unter der Lokale Sicherheitsrichtlinie (oder eventuell über Gruppenrichtlinien). Wenn Sie Sie ändern, ist ein Neustart erforderlich.
UserToken
ist eine Eigenschaft, die geschlossen werden können, überReleaseUserToken
weil wir rufenStartProcess
wiederholt und uns wurde gesagt, dass Sie sich nicht anmelden, die anderen Benutzer auf, wieder und wieder.Dass
SecureStringToString()
Methode wurde schon von diese Frage. MitSecureString
war nicht Teil von Microsoft ' s Empfehlung, habe ich es auf diese Weise, so nicht, um die Kompatibilität mit anderen code.Process
Klasse?W
ide (Unicode) - Methode aufrufen, für dieLogonUser
nennen und dieA
nsi-Methode aufrufen, für die createprocess-Aufruf?Dies ist eine Ausnahme, die spezifisch für Microsoft Visual C++, facility code 0x6d. Der Fehler code ist 0x007e (126), ERROR_MOD_NOT_FOUND, mit Der "das angegebene Modul konnte nicht gefunden werden". Diese Ausnahme wird ausgelöst, wenn eine delay-loaded DLL nicht gefunden werden kann. Die meisten Programmierer haben den code, der generiert diese Ausnahme auf Ihre Maschine, vc/include/delayhlp.cpp in der Visual Studio-Installationsverzeichnis.
Gut, es ist das typische "Datei nicht gefunden" Missgeschick, zu einer bestimmten DLL. Wenn Sie keine Idee haben, was DLL fehlt, dann können Sie mit SysInternals' ProcMon-Dienstprogramm. Sie werden sehen, das Programm, suchen Sie die DLL und nicht zu finden, bevor es Bomben.
Eine klassische Weg, um schlecht konzipierte Programme zum Absturz mit Prozess.Start() wird durch die Einstellung nicht ProcessStartInfo.WorkingDirectory-Eigenschaft für das Verzeichnis, in dem die EXE gespeichert ist. Es ist in der Regel durch einen Unfall, aber nicht, wenn Sie die Process-Klasse. Nicht Aussehen wie Sie so anzugehen, dass den ersten.
ProcessStartInfo.WorkingDirectory
ändert nichts für mich. Reflektiert durchSystem.Diagnostic.Process
sagt mir, dass wenn dieser Wert nicht festgelegt, wird .NET verwendenEnvironment.CurrentDirectory
. Gibt es einen speziellen Arbeitsverzeichnis, das Gefühl, ich sollte der Wert?/delayload
option, um zu sehen, wenn Sie Visual Studio verwenden.