Dieser Beitrag ist als Erweiterung der Antwort von @Matt Howells gedacht, insbesondere für diejenigen, die Probleme mit der Verwendung von Jobobjekten unter Vista oder Win7 haben , insbesondere wenn beim Aufrufen von AssignProcessToJobObject der Fehler "Zugriff verweigert" ('5') angezeigt wird.
tl; dr
Fügen Sie dem übergeordneten .NET-Prozess das folgende Manifest hinzu, um die Kompatibilität mit Vista und Win7 sicherzustellen:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
<v3:security>
<v3:requestedPrivileges>
<v3:requestedExecutionLevel level="asInvoker" uiAccess="false" />
</v3:requestedPrivileges>
</v3:security>
</v3:trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<!-- We specify these, in addition to the UAC above, so we avoid Program Compatibility Assistant in Vista and Win7 -->
<!-- We try to avoid PCA so we can use Windows Job Objects -->
<!-- See https://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed -->
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
</assembly>
Beachten Sie, dass beim Hinzufügen eines neuen Manifests in Visual Studio 2012 das obige Snippet bereits enthalten ist, sodass Sie es nicht aus Hear kopieren müssen. Es wird auch einen Knoten für Windows 8 enthalten.
vollständige Erklärung
Ihre Jobzuordnung schlägt mit einem Fehler "Zugriff verweigert" fehl, wenn der von Ihnen gestartete Prozess bereits einem anderen Job zugeordnet ist. Rufen Sie den Programmkompatibilitäts-Assistenten auf, der ab Windows Vista alle Arten von Prozessen seinen eigenen Jobs zuweist.
In Vista können Sie Ihre Anwendung als von PCA ausgeschlossen markieren, indem Sie einfach ein Anwendungsmanifest einfügen. Visual Studio scheint dies für .NET-Apps automatisch zu tun, sodass Sie dort in Ordnung sind.
Ein einfaches Manifest schneidet es in Win7 nicht mehr. [1] Dort müssen Sie speziell angeben, dass Sie mit Win7 mit dem Tag in Ihrem Manifest kompatibel sind. [2]
Dies führte dazu, dass ich mir Sorgen um Windows 8 machte. Muss ich mein Manifest noch einmal ändern? Anscheinend gibt es eine Unterbrechung in den Clouds, da Windows 8 jetzt zulässt, dass ein Prozess zu mehreren Jobs gehört. [3] Also habe ich es noch nicht getestet, aber ich stelle mir vor, dass dieser Wahnsinn jetzt vorbei sein wird, wenn Sie einfach ein Manifest mit den unterstützten OS-Informationen hinzufügen.
Tipp 1 : Wenn Sie wie ich eine .NET-App mit Visual Studio entwickeln, finden Sie hier [4] einige nützliche Anweisungen zum Anpassen Ihres Anwendungsmanifests.
Tipp 2 : Seien Sie vorsichtig beim Starten Ihrer Anwendung in Visual Studio. Ich stellte fest, dass ich nach dem Hinzufügen des entsprechenden Manifests beim Starten von Visual Studio immer noch Probleme mit PCA hatte, selbst wenn ich Start ohne Debugging verwendet habe. Das Starten meiner Anwendung über den Explorer hat jedoch funktioniert. Nach dem manuellen Hinzufügen von devenv zum Ausschluss von PCA mithilfe der Registrierung funktionierten auch das Starten von Anwendungen, die Jobobjekte von VS verwendeten. [5]
Tipp 3 : Wenn Sie jemals wissen möchten, ob PCA Ihr Problem ist, starten Sie Ihre Anwendung über die Befehlszeile oder kopieren Sie das Programm auf ein Netzwerklaufwerk und führen Sie es von dort aus aus. PCA wird in diesen Kontexten automatisch deaktiviert.
[1] http://blogs.msdn.com/b/cjacks/archive/2009/06/18/pca-changes-for-windows-7-how-to-tell-us-you-are-not-an -installer-take-2-weil-wir-die-Regeln-für-dich-geändert haben.aspx
[2] http://ayende.com/blog/4360/how-to-opt-out-of-program-compatibility-assistant
[3] http://msdn.microsoft.com/en-us/library/windows/desktop/ms681949(v=vs.85).aspx : "Ein Prozess kann in Windows 8 mehreren Jobs zugeordnet werden."
[4] Wie kann ich mit VS2008 ein Anwendungsmanifest in eine Anwendung einbetten?
[5] Wie kann ich verhindern, dass der Visual Studio-Debugger meinen Prozess in einem Jobobjekt startet?