2008-08-26 27 views
3

Mein Code muss ermitteln, wie lange ein bestimmter Prozess ausgeführt wurde. Aber es schlägt weiterhin mit einer Zugriff verweigert Fehlermeldung auf der Anforderung Process.StartTime fehl. Dies ist ein Prozess, der mit den Anmeldeinformationen eines Benutzers ausgeführt wird (dh kein Prozess mit hoher Zugriffsberechtigung). Es gibt eindeutig eine Sicherheitseinstellung oder eine Richtlinieneinstellung, oder etwas, dass ich mit drehen muss, um dies zu beheben, da ich nicht glauben kann, dass die Eigenschaft StartTime im Framework nur so ist, dass es zu 100% der Zeit fehlschlagen kann.Process.StartTime Zugriff verweigert

Eine Google-Suche zeigte an, dass ich dies beheben konnte, indem ich den Benutzer, dessen Berechtigungsnachweise der Abfragecode ausführt, zur Gruppe "Performance Log Users" hinzufügt. Auf dieser Maschine existiert jedoch keine solche Benutzergruppe.

Antwort

1

Der zugrunde liegende Code muss in der Lage sein, OpenProcess aufzurufen, für das Sie möglicherweise SeDebugPrivilege benötigen.

Ist der Prozess, den Sie die StartTime-Anforderung ausführen, als ein anderer Benutzer zu Ihrem eigenen Prozess ausgeführt?

0

OK, tut mir leid, dass das nicht funktioniert ... Ich bin kein Experte für ASP.NET Identitätswechsel, ich neige dazu, App-Pools zu verwenden, von denen ich nicht glaube, dass Sie auf W2K tun können App, die die gleiche Abfrage ausführt, und dann das als verschiedene Benutzer ausführen?

Ich zögere, hier ein Stück MS-Framework-Code zu veröffentlichen, aber Sie könnten entweder Reflektor oder http://www.codeplex.com/NetMassDownloader verwenden, um den Quellcode für die relevanten Bits des Frameworks zu erhalten, so dass Sie versuchen könnten, verschiedene Bits zu implementieren, um zu sehen, wo es schlägt fehl.

Können Sie weitere Informationen über den Prozess erhalten, ohne Zugriff verweigert zu bekommen?

0

Ich kann den Prozess aufzählen (dh die GetProcessById-Funktion funktioniert), und wir haben anderen Code, der den EXE-Namen und andere Bits von Informationen erhält.

Ich werde die Test-App versuchen. Ich werde auch versuchen, WMI zu verwenden, um diese Informationen zu erhalten, wenn ich die C# -Implementierung in kurzer Zeit nicht richtig funktionieren lassen kann (dies ist keine kritische Funktionalität, daher kann ich keine Tage damit verbringen).

2

Der Prozess von .Net 1.1 verwendet die Leistungsindikatoren, um die Informationen abzurufen. Entweder sind sie deaktiviert oder der Benutzer hat keine Administratorrechte. Wenn Sie sicherstellen, dass die Leistungsindikatoren aktiviert sind und der Benutzer ein Administrator ist, sollte Ihr Code funktionieren.

Eigentlich sollte die "Performance Counter Users Group" genug sein. Die Gruppe existiert standardmäßig nicht. Sie sollten es also selbst erstellen.

Der Prozess von .Net 2.0 ist nicht von den Leistungsindikatoren abhängig.

Siehe http://weblogs.asp.net/nunitaddin/archive/2004/11/21/267559.aspx

3

ich etwas gelesen habe ähnlich dem, was Sie gesagt haben in der Vergangenheit, Lars. Leider bin ich etwas eingeschränkt mit dem, was ich mit der fraglichen Maschine machen kann (mit anderen Worten, ich kann keine unnötigen Benutzergruppen erstellen: es ist ein Server, nicht irgendein zufälliger PC).

Danke für die Antworten, Will und Lars. Leider haben sie mein Problem nicht gelöst.

ultimative Lösung ist WMI zu verwenden:

using System.Management; 
String queryString = "select CreationDate from Win32_Process where ProcessId='" + ProcessId + "'"; 
SelectQuery query = new SelectQuery(queryString); 

ManagementScope scope = new System.Management.ManagementScope(@"\\.\root\CIMV2"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
ManagementObjectCollection processes = searcher.Get(); 

    //... snip ... logic to figure out which of the processes in the collection is the right one goes here 

DateTime startTime = ManagementDateTimeConverter.ToDateTime(processes[0]["CreationDate"].ToString()); 
TimeSpan uptime = DateTime.Now.Subtract(startTime); 

Teile dieses von Code Project geschabt wurden: "Hey, Scripting Guy"

http://www.codeproject.com/KB/system/win32processusingwmi.aspx

Und:

http://www.microsoft.com/technet/scriptcenter/resources/qanda/jul05/hey0720.mspx