Ich habe mehrere Antworten zur Verwendung von Handle oder Process Monitor gesehen , möchte aber in meinem eigenen Code (C #) herausfinden können, welcher Prozess eine Datei sperrt.
Ich habe das böse Gefühl, dass ich in der win32-API herumspielen muss, aber wenn jemand dies bereits getan hat und mich auf den richtigen Weg bringen kann, würde ich die Hilfe wirklich schätzen.
Aktualisieren
Links zu ähnlichen Fragen
c#
file-locking
AJ.
quelle
quelle
Antworten:
Eines der guten Dinge
handle.exe
ist, dass Sie es als Unterprozess ausführen und die Ausgabe analysieren können.Wir tun dies in unserem Bereitstellungsskript - funktioniert wie ein Zauber.
quelle
Vor langer Zeit war es unmöglich, die Liste der Prozesse, die eine Datei sperren, zuverlässig abzurufen, da Windows diese Informationen einfach nicht nachverfolgte. Um die Restart Manager-API zu unterstützen , werden diese Informationen jetzt nachverfolgt.
Ich habe Code zusammengestellt, der den Pfad einer Datei verwendet und einen
List<Process>
aller Prozesse zurückgibt , die diese Datei sperren.Verwendung mit eingeschränkter Berechtigung (z. B. IIS)
Dieser Aufruf greift auf die Registrierung zu. Wenn der Prozess nicht die Erlaubnis dazu hat, werden Sie ERROR_WRITE_FAULT bekommen, was bedeutet
An operation was unable to read or write to the registry
. Sie können Ihrem eingeschränkten Konto selektiv die Berechtigung für den erforderlichen Teil der Registrierung erteilen. Es ist jedoch sicherer, wenn Ihr Prozess mit eingeschränktem Zugriff ein Flag setzt (z. B. in der Datenbank oder im Dateisystem oder mithilfe eines Interprozesskommunikationsmechanismus wie Warteschlange oder Named Pipe) und ein zweiter Prozess die Restart Manager-API aufruft.Das Gewähren von nicht minimalen Berechtigungen für den IIS-Benutzer ist ein Sicherheitsrisiko.
quelle
tasklist /m YourDllName.dll
die Ausgabe verwenden und analysieren. Siehe stackoverflow.com/questions/152506/…Es ist sehr komplex, Win32 von C # aus aufzurufen.
Sie sollten das Tool Handle.exe verwenden .
Danach muss Ihr C # -Code wie folgt lauten:
quelle
/accepteula
. Ich habe Gennadys Antwort mit der Änderung aktualisiert.handle.exe
Ich hatte Probleme mit Stefans Lösung . Unten ist eine modifizierte Version, die gut zu funktionieren scheint.
AKTUALISIEREN
Wenn Sie nur wissen möchten, welche Prozesse eine bestimmte DLL sperren, können Sie die Ausgabe von ausführen und analysieren
tasklist /m YourDllName.dll
. Funktioniert unter Windows XP und höher. SehenWas macht das? Aufgabenliste / m "mscor *"
quelle
myProcessArray
ein Klassenmitglied (aber auch tatsächlich von getFileProcesses () zurückgekehrt ist? Gleiches gilt fürmyProcess
.Dies funktioniert für DLLs, die von anderen Prozessen gesperrt wurden. Diese Routine findet beispielsweise nicht heraus, dass eine Textdatei durch ein Textverarbeitungsprogramm gesperrt ist.
C #:
VB.Net:
quelle
einfacher mit linq:
quelle