Wie kann ich feststellen, ob eine bestimmte Datei in Windows geöffnet ist? [geschlossen]

87

Eines meiner Lieblingswerkzeuge für Linux ist lsof - ein echtes Schweizer Taschenmesser!

Heute habe ich mich gefragt, bei welchen Programmen auf einem WinXP-System eine bestimmte Datei geöffnet war. Gibt es einen äquivalenten Nutzen für lsof? Außerdem befand sich die fragliche Datei über eine Netzwerkfreigabe, sodass ich nicht sicher bin, ob dies die Sache kompliziert.

Daniel Fone
quelle

Antworten:

73

Verwenden Sie den Prozess-Explorer aus der Sysinternals Suite. Mit der Funktion "Handle suchen" oder "DLL" können Sie nach dem Prozess suchen, bei dem diese Datei geöffnet ist.

Jay Hofacker
quelle
Beantwortet dies wirklich die Frage? Mit dem Prozess-Explorer können Sie sehen, welche Dateien für einen bestimmten Prozess / Handle / DLL / was auch immer geöffnet sind. Dies ist jedoch die umgekehrte Zuordnung. Siehe meine Antwort stackoverflow.com/questions/15708/… auf diese Frage.
Greg Mattes
6
Ja tut es. Klicken Sie auf Find Handle oder Dll (oder drücken Sie Strg-F), geben Sie den Namen der gesuchten Datei ein und Sie erhalten eine Liste der Prozesse, bei denen diese Datei geöffnet ist.
Jay Hofacker
Process Explorer wurde jetzt umbenannt und in "Process Monitor" gebündelt.
Matthew McCullough
7
@MatthewMcCullough Referenzen? Sie sind falsch, Process Explorer und Process Monitor sind zwei verschiedene Dienstprogramme.
Alois Mahdal
2
Verfügt Process Explorer über eine Befehlszeilenschnittstelle?
Anderson Green
40

Das Äquivalent von lsof -p pidist die kombinierte Ausgabe von sysinternals handle und listdlls, dh

handle -p pid
listdlls -p pid

Sie können pid mit sysinternals herausfinden pslist.

Peter - Setzen Sie Monica wieder ein
quelle
10

Versuchen Sie es mit Handle . Filemon & Regmon eignen sich auch hervorragend, um herauszufinden, was das Duce-Programm foo mit Ihrem System macht.

Slipsec
quelle
@slipsec FileMon und Regmon werden jetzt unter Windows Monitor SP4, Windows XP SP2, Windows Server 2003 SP1 und Windows Vista durch Process Monitor v3.2 ersetzt .
Glücklicher
6

Ein Äquivalent von lsof könnte die Ausgabe von Sysinternals ' Handle und Listendlls sein , dh:

c:\SysInternals>handle
[...]
------------------------------------------------------------------------------
gvim.exe pid: 5380 FOO\alois.mahdal
   10: File  (RW-)   C:\Windows
   1C: File  (RW-)   D:\some\locked\path\OpenFile.txt
[...]

c:\SysInternals>listdlls
[...]
------------------------------------------------------------------------------
Listdlls.exe pid: 6840
Command line: listdlls

  Base        Size      Version         Path
  0x00400000  0x29000   2.25.0000.0000  D:\opt\SysinternalsSuite\Listdlls.exe
  0x76ed0000  0x180000  6.01.7601.17725  C:\Windows\SysWOW64\ntdll.dll
[...]

c:\SysInternals>listdlls

Leider müssen Sie "als Administrator ausführen", um sie verwenden zu können.

Außerdem erzeugen listdlls und handle keine fortlaufende tabellenähnliche Form, sodass durch Filtern des Dateinamens die PID ausgeblendet wird . findstr /c:pid: /c:<filename>sollte Sie jedoch mit beiden Dienstprogrammen sehr nahe bringen

c:\SysinternalsSuite>handle | findstr /c:pid: /c:Driver.pm
System pid: 4 \<unable to open process>
smss.exe pid: 308 NT AUTHORITY\SYSTEM
avgrsa.exe pid: 384 NT AUTHORITY\SYSTEM
[...]
cmd.exe pid: 7140 FOO\alois.mahdal
conhost.exe pid: 1212 FOO\alois.mahdal
gvim.exe pid: 3408 FOO\alois.mahdal
  188: File  (RW-)   D:\some\locked\path\OpenFile.txt
taskmgr.exe pid: 6016 FOO\alois.mahdal
[...]

Hier können wir sehen, dass gvim.exe diese Datei geöffnet hat.

Alois Mahdal
quelle
5

Versuchen Sie Unlocker .

Die Unlocker-Site verfügt über ein übersichtliches Diagramm (scrollen Sie nach unten, nachdem Sie dem Link gefolgt sind), das einen Vergleich mit anderen Tools zeigt. Offensichtlich sind solche Vergleiche normalerweise voreingenommen, da sie normalerweise vom Tool-Autor geschrieben werden. In der Tabelle sind jedoch zumindest die Alternativen aufgeführt, damit Sie sie selbst ausprobieren können.

Greg Mattes
quelle
4
Unlocker listet nur gesperrte Dateien auf, nicht geöffnete Dateien. Die meisten Windows-Programme sperren die verwendete DLL, nicht jedoch Ihre Dokumente.
Tobias
5

Wenn es sich bei der Datei um eine DLL handelt, können Sie mithilfe der TaskList- Befehlszeilen-App sehen, von wem sie geöffnet wurde:

TaskList /M nameof.dll
Sean
quelle
3

Wenn Sie mit der rechten Maustaste auf das Symbol "Computer" (oder "Arbeitsplatz") klicken und im Popup-Menü "Verwalten" auswählen, gelangen Sie zur Computerverwaltungskonsole.

Dort finden Sie unter System Tools \ Shared Folders "Open Files". Dies entspricht wahrscheinlich Ihren Wünschen. Wenn sich die Datei jedoch auf einer Netzwerkfreigabe befindet, müssen Sie auf dem Server, auf dem sich die Datei befindet, dasselbe tun.

Matt Hamilton
quelle
3
Beachten Sie, dass hier nur freigegebene Dateien angezeigt werden, die von anderen Netzwerkbenutzern geöffnet werden. Es hilft nicht, Dateien zu finden, die auf dem lokalen System geöffnet sind. Wenn Sie dies auf dem Server tun, erfahren Sie wahrscheinlich, welcher Benutzer die Datei geöffnet hat, aber nicht welches Programm auf dem Computer dieses Benutzers. Der Prozess-Explorer (wie von @JayHofacker erwähnt) hat bei mir gut funktioniert.
Tomlogic
3

Es gibt ein Programm "OpenFiles", das Teil von Windows 7 zu sein scheint. Es scheint, dass es tun kann, was Sie wollen. Es kann Dateien auflisten, die von Remotebenutzern geöffnet wurden (über die Dateifreigabe), und nach dem Aufruf von "openfiles / Local on" und einem Systemneustart sollte es in der Lage sein, lokal geöffnete Dateien anzuzeigen. Letzteres soll Leistungseinbußen haben.

anonym
quelle
1
Ich komme hierher, um herauszufinden, wer mich daran hindert, einen Ordner zu löschen und einen Neustart zu vermeiden, und ich finde, dass der Befehl, den ich benötige, ein Konfigurationssetup erfordert, das ... Sie haben es erraten ... einen Neustart erfordert. Wie sehr sehr Fenster.
Gus
Leute, seid euch bewusst, dass der Befehl openfiles eine LANGE Zeit in Anspruch nimmt (in der Größenordnung von 4 Minuten)!
NH.
2

Verwenden Sie den Prozess-Explorer, um die Prozess-ID zu ermitteln. Verwenden Sie dann Handle , um herauszufinden, welche Dateien geöffnet sind.

ZB Griff -p

Ich mag diesen Ansatz, weil Sie Dienstprogramme von Microsoft selbst verwenden.

pushNpop
quelle
Wenn wir nur Quellcode für diese hätten
Graywolf
2

In OpenedFilesView gibt es im Menü Optionen einen Menüpunkt mit dem Namen "Netzwerkdateien anzeigen". Wenn dies aktiviert ist, ist das oben genannte Dienstprogramm möglicherweise von Nutzen.

M8R-qpgep8
quelle