Windows: jak sprawdzić, co blokuje wysunięcie nośnika?
Jeżeli pendrive lub dysk przenośny jest zajęty, gdy chcemy go odpiąć od komputera, Windows poinformuje nas o tym po naciśnięciu przycisku bezpiecznego wysunięcia. Nie powie jednak, który dokładnie program używa wtedy dysku - ale da się to sprawdzić.
23.07.2024 06:30
Funkcja "bezpiecznego wysuwania urządzeń" jest już dziś obiektem żartów. Pendrive'y bardzo rzadko ulegają uszkodzeniu podczas odpinania, komunikat z ostrzeżeniem brzmi nieproporcjonalnie złowrogo względem konsekwencji, a system nierzadko ostrzega przed odpinaniem USB nawet, gdy nic nie korzysta z dysku. Bezpieczne wysuwanie w Windows stało się na tyle mało konieczne, że wiele osób w ogóle nie wie o istnieniu tej funkcji, zawsze po prostu odpinając pendrive'a po użyciu.
Zobacz także
Windows także został zoptymalizowany pod kątem sposobu kolejkowania zapisów i obsługi pamięci podręcznej tak, by straty w razie nagłego odpięcia były jak najmniejsze. W połączeniu ze wzrostem prędkości pamięci półprzewodnikowych, konieczność wykonywania specjalnej operacji przed odpięciem nośnika praktycznie zniknęła. Ostatnimi systemami, które bezwarunkowo krzyczały na użytkownika po odpięciu pendrive'a bez ostrzeżenia były Windows Millennium Edition i Windows 2000. Nawet XP oduczył się tego wraz z którymś z Service Packów.
Czy to jest potrzebne?
Dziś komunikat o błędzie otrzymamy tylko gdy przerwiemy wskutek odpięcia jakąś nieodroczoną, trwającą właśnie operację zapisu, lub gdy jakiś program spróbuje coś odczytać z "literki", która właśnie zniknęła. Niemniej, w przypadku starszych urządzeń, dysków talerzowych oraz nośników lub danych, co do których szczególnie zależy nam na uniknięciu utraty/uszkodzenia, bezpieczne usuwanie urządzenia może być przydatne.
Dziś ikona bezpiecznego usuwania urządzenia stosuje już mniej pretensjonalne nazewnictwo i w kwestii pendrive'ów i dysków opisuje opcje jako "wysuwanie nośnika". Jeżeli wysunięcie się powiedzie, to znaczy że nie trwały żadne operacje I/O, zsynchronizowano pamięć podręczną zapisu i żaden program nie oczekiwał obecności nośnika, który możemy wtedy odpiąć.
Sukces procedury wysuwania zostanie obwieszczony natywnym powiadomieniem w prawym dolnym roku ekranu. Jeżeli jednak jakiś program dalej używa dysku, mechanizm wysuwania otrzyma odmowę. Windows wyświetli wtedy archaiczne okienko o formie i treści znanych z Windows 2000. Nie zawiera ono jednak informacji o tym, który program zawetował wysuwanie nośnika.
Użyjmy Powershella
Informacja ta znajduje się jednak w systemowym logu i da się ją wyciągnąć za pomocą Podglądu Zdarzeń oraz PowerShella. W klienckich wersjach Windows odczytanie tych informacji nie wymaga uprawnień administracyjnych. Aby dowiedzieć się, jak nazywał się proces, który zawetował ostatnią próbę wysunięcia nośnika (i który to był nośnik), należy zastosować następujące polecenie:
function Get-EjectBlocker {
[CmdletBinding()]
$msgpcs = New-Object System.Collections.Hashtable
'VetoingDevices','ProcessName','ProcessId' | `
Foreach-Object { `
$a = $_ ;
$msgpcs.Add($a ,`
(`
(
[xml](
(
Get-WinEvent -FilterHashTable `
@{
LogName='System'
ProviderName='*Kernel-PnP'
ID='225'
} -MaxEvents 1
).ToXml()
)
).Event.EventData.Data | Where-Object `
{
$_.Name -eq $a
}
).'#text'.ToString().Normalize().Trim()
)
}
Write-Verbose "Wysunięcie urządzenia $($msgpcs.VetoingDevices) jest blokowane przez proces $($msgpcs.ProcessName) ($($msgpcs.ProcessId))."
return $msgpcs
}
Get-EjectBlocker
Otrzymamy w ten sposób nazwę programu i jego PID oraz dokładną nazwę zablokowanego urządzenia. Dzięki temu możemy znaleźć i wyłączyć problematyczny program, po czym spróbować ponownie. Bardzo często w Windows 11 programem wetującym żądanie wysunięcia urządzenia jest… Menedżer Zadań. Warto zatem spróbować wyłączyć go zanim sięgniemy po terminal i polecenia PowerShella.
Kamil J. Dudek, współpracownik redakcji dobreprogramy.pl