DeMue Geschrieben 14. Januar 2009 Geschrieben 14. Januar 2009 Hallo zusammen, wie kann man mit C# auszulesen, wer gerade Zugriff auf eine bestimmte dll oder exe hat? Viele Grüße DeMue Zitieren
Shadowman Geschrieben 14. Januar 2009 Geschrieben 14. Januar 2009 würde mich auch interessieren, da ich teilweise daten kurzzeitig nicht umbenennen oder verschieben kann, da bereits auf diese zugegriffen wird Zitieren
TDM Geschrieben 14. Januar 2009 Geschrieben 14. Januar 2009 Überprüfen ob eine Datei geöffnet ist, ist ja einfach. Aber wer darauf zugreift ... hmm ... Ich denke das wird irgendeine Klasse in System.Diagnostics zeigen, welche - keine Ahnung. Ihr meint doch sicher sowas: Process Explorer Zitieren
DeMue Geschrieben 14. Januar 2009 Autor Geschrieben 14. Januar 2009 Ja, sowas in der Art. Aber eben als C# Funktion, da ich das Ergebnis in eine Variable schreiben muss... Zitieren
Shadowman Geschrieben 14. Januar 2009 Geschrieben 14. Januar 2009 (bearbeitet) Überprüfen ob eine Datei geöffnet ist, ist ja einfach. Geht es ein bisschen genauer? Habe leider keine Ahnung wie. Ausserdem muss ich rausfinden, von welchem Prozess die Datei geöffnet ist, denn es tritt auch auf, wenn kein Programm geöffnet ist. Im Taskmanager ist kein Programm zu finden, was auch nur annähernd in der Lage wäre diese Dateien zu öffnen. Es handelt sich nicht immer um die selbe Datei, sondern eine zufällige aus ca. 80, die sich alle auf einer Festplatte und im selben Ordner befinden oder dessen Unterordner befinden. Also muss es irgendeinen versteckten Prozess geben, der diese Dateien blockiert. Diesen möchte ich ausfindig machen und endgültig von meinem System entfernen. EDIT: sorry...hatte deinen post nicht gelesen DeMue. Das werde ich später mal ausprobieren Bearbeitet 14. Januar 2009 von Shadowman Zitieren
TDM Geschrieben 14. Januar 2009 Geschrieben 14. Januar 2009 hmm... Ich hab jetzt mal ein Bisschen mit der API bzw. WQL rumgespielt, Folgendes funktioniert soweit ganz gut: class Program { static void Main(string[] args) { ReadProcessOnFile(@"C:\\Program Files\\Mozilla Firefox\\firefox.exe"); } static void ReadProcessOnFile(string path) { string x = string.Empty; SelectQuery query = new SelectQuery("SELECT * FROM CIM_DataFile WHERE Name = '" + path + "'"); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { foreach (ManagementObject mo in searcher.Get()) { x = "File Name: " + mo.Properties["Name"].Value + "\nIs currently opened by:\n"; foreach (ManagementBaseObject b in mo.GetRelated("Win32_Process")) { string p = ShowProcessProperties(b.ToString()); b.Dispose(); x += p + "\n"; } } } Console.WriteLine(x); } static string ShowProcessProperties(string objectClass) { using (ManagementObject process = new ManagementObject(objectClass)) { process.Get(); PropertyDataCollection processProperties = process.Properties; string x = null; x = "ProcessID := " + processProperties["ProcessID"].Value + " Command Line = " + processProperties["CommandLine"].Value + "\n"; return x; } } } Kann man natürlich noch hübscher machen, aber zumindest bekomm ich alle Prozesse angezeigt, die die betreffende Datei verwenden. Zitieren
DeMue Geschrieben 15. Januar 2009 Autor Geschrieben 15. Januar 2009 Moin, danke sowas ähnliches habe ich gesucht. Ich werds mir nachher mal anschauen! (: Viele Grüße DeMue Zitieren
TDM Geschrieben 15. Januar 2009 Geschrieben 15. Januar 2009 Da du ja evtl. noch den Benutzernamen haben willst, hier die neuere Version: static void ReadProcessOnFile(string path) { string x = string.Empty; SelectQuery query = new SelectQuery("SELECT * FROM CIM_DataFile WHERE Name = '" + path + "'"); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { foreach (ManagementObject mo in searcher.Get()) { Dictionary<string, string> properties = new Dictionary<string,string>(); x = "File Name: " + mo.Properties["Name"].Value + "\nIs currently opened by:\n"; foreach (ManagementBaseObject b in mo.GetRelated("Win32_Process")) { properties = GetProcessProperties(b.ToString()); Dictionary<string, string>.KeyCollection keys = properties.Keys; foreach (string key in keys) { x += key + ":" + properties[key]+"\n"; } b.Dispose(); } } } Console.WriteLine(x); } static Dictionary<string, string> GetProcessProperties(string objectClass) { Dictionary<string, string> properties = new Dictionary<string, string>(); using (ManagementObject process = new ManagementObject(objectClass)) { process.Get(); Process p = Process.GetProcessById(Convert.ToInt32(process.Properties["ProcessID"].Value.ToString())); properties.Add("ProcessID", p.Id.ToString()); properties.Add("HandleCount", p.HandleCount.ToString()); properties.Add("HasExited", p.HasExited.ToString()); properties.Add("MachineName", p.MachineName); properties.Add("Owner", GetUserByProcess(p)); properties.Add("MainModule", p.MainModule.ToString()); properties.Add("MainWindowTitle", p.MainWindowTitle); properties.Add("PriorityBoostEnabled", p.PriorityBoostEnabled.ToString()); properties.Add("ProcessName", p.ProcessName); properties.Add("SessionId", p.SessionId.ToString()); } return properties; } static string GetUserByProcess(Process process) { string query = "Select * From Win32_Process Where ProcessID = " + process.Id; string ret = "none"; using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { ManagementObjectCollection processList = searcher.Get(); foreach (ManagementObject obj in processList) { string[] argList = new string[] { string.Empty }; int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList)); if (returnVal == 0) ret = argList[0]; } } return ret; } Zitieren
bi0s Geschrieben 22. Januar 2009 Geschrieben 22. Januar 2009 Hey TDM, sehr schöne Funktion ! Kann ich auch sehr gut gebrauchen.. leider bekomme ich das ganze nicht so zum laufen Hab mir nen OpenFiledialog gemacht und die geöffnete .exe als string path übergeben, ReadProcessOnFile(openFileDialog.FileName); Leider bekomme ich ne Exepcetion mit "Die Anfrage ist ungültig." eventuell ne idee was ich falsch mache oO ? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.