Widziałem kilka odpowiedzi na temat używania uchwytu lub monitora procesu , ale chciałbym móc dowiedzieć się we własnym kodzie (C #), który proces blokuje plik.
Mam paskudne przeczucie, że będę musiał pogrzebać w API win32, ale jeśli ktoś już to zrobił i może skierować mnie na właściwą ścieżkę, byłbym wdzięczny za pomoc.
Aktualizacja
Linki do podobnych pytań
c#
file-locking
AJ.
źródło
źródło
Odpowiedzi:
Jedną z dobrych rzeczy
handle.exe
jest to, że można go uruchomić jako podproces i przeanalizować dane wyjściowe.Robimy to w naszym skrypcie wdrożeniowym - działa jak urok.
źródło
Dawno temu niemożliwe było wiarygodne pobranie listy procesów blokujących plik, ponieważ system Windows po prostu nie śledził tych informacji. Do obsługi interfejsu API Restart Manager , te informacje są teraz śledzone.
Złożyłem kod, który pobiera ścieżkę do pliku i zwraca
List<Process>
wszystkie procesy blokujące ten plik.Korzystanie z ograniczonych uprawnień (np. IIS)
To wywołanie uzyskuje dostęp do rejestru. Jeśli proces nie ma na to uprawnień, otrzymasz ERROR_WRITE_FAULT, czyli
An operation was unable to read or write to the registry
. Państwo mogłoby selektywnie zezwolić na swoim koncie ograniczonym do niezbędnego części rejestru. Bezpieczniej jest jednak ustawić flagę procesu ograniczonego dostępu (np. W bazie danych lub systemie plików, albo przy użyciu mechanizmu komunikacji międzyprocesowej, takiej jak kolejka lub nazwany potok) i wywołać drugi proces z API Restart Manager.Udzielanie uprawnień innych niż minimalne użytkownikowi usług IIS stanowi zagrożenie bezpieczeństwa.
źródło
tasklist /m YourDllName.dll
i przeanalizować dane wyjściowe. Zobacz stackoverflow.com/questions/152506/…Wywołanie Win32 z poziomu C # jest bardzo złożone.
Należy użyć narzędzia Handle.exe .
Następnie Twój kod C # musi być następujący:
źródło
/accepteula
. Zaktualizowałem odpowiedź Giennadija o zmianę.handle.exe
Miałem problemy z rozwiązaniem Stefana . Poniżej znajduje się zmodyfikowana wersja, która wydaje się działać dobrze.
AKTUALIZACJA
Jeśli chcesz tylko wiedzieć, które procesy blokują konkretną bibliotekę DLL, możesz wykonać i przeanalizować dane wyjściowe
tasklist /m YourDllName.dll
. Działa na Windows XP i nowszych. WidziećCo to robi? lista zadań / m "mscor *"
źródło
myProcessArray
jest członkiem klasy (ale także w rzeczywistości wraca z getFileProcesses ()? To samo dotyczymyProcess
.Działa to w przypadku bibliotek DLL zablokowanych przez inne procesy. Ta procedura nie wykryje na przykład, że plik tekstowy jest zablokowany przez proces tekstowy.
DO#:
VB.Net:
źródło
prostsze z linq:
źródło