Pchełki Powershell: kompresja z hasłem i menu podręczne
Dziś będzie o tym, jak w Powershell zrobić sobie następującego cosia:
-
Klikamy prawym myszem w dowolny plik w Eksploratorze
-
Z menu wybieramy "zzipuj z hasłem"
-
Dostajemy pytanie o hasło, wpisujemy hasło
-
Czary mary i w lokalizacji z plikiem, obok, pojawia się ten sam plik, ale skompresowany (czyli z końcówką .zip) z użyciem podanego hasła
Dodatkowo zakładamy, że użytkownik ma zainstalowany program 7-Zip w wersji 64-bitowej, w domyślnej lokalizacji.
Aby to osiągnąć, potrzebujemy dwóch elementów:
-
Skryptu, który weźmie od systemu operacyjnego nazwę pliku, zapyta o hasło i zzipuje ten plik używając tego hasła, oraz
-
Wpisu w rejestrze systemowym, który doda opcję w menu podręcznym Eksploratora Windows, po kliknięciu na plik prawym klawiszem myszy.
1
W kwestii pierwszego elementu, skorzystamy z PowerShell, który jest w Windows zawsze dostępny. Skrypt jest dość przejrzysty:
param([string]$plik)
$plik = $plik.Replace("'","")
$haslo_ss = Read-Host -Prompt "Wpisz hasło: " -AsSecureString
$haslo = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($haslo_ss))
if ([string]::IsNullOrWhiteSpace($haslo)) {
Write-Host "Błąd: hasło nie może być puste." -ForegroundColor Red
pause
exit 1
}
$folder = Split-Path $plik
$samPlik = Split-Path $plik -Leaf
$nowaNazwa = Join-Path $folder ($samPlik + ".zip")
$paker = "C:\Program Files\7-Zip\7z.exe"
& "$paker" a -tzip "$nowaNazwa" "$plik" -p"$haslo"
Write-Host "Spakowane i zapisane jako: $nowaNazwa"
Niektóre polecenia mogą wydać się na pierwszy rzut oka nieoczywiste. Na przykład w trzeciej linii usuwamy z parametry pojedyncze znaki cudzysłowia - czyli odwracamy to, co dodaliśmy w pliku .reg (patrz punt 2 poniżej).
W liniach 4-5 najpierw wczytujemy hasło w sposób "wygwiazdkowany" (żeby jakiś złodupiec nie zajrzał nam przez ramię i nie podejrzał hasła), a potem je - już lokalnie, w pamięci - "odgwiazdkowujemy" do dalszego użycia.
W liniach 7-11 sprawdzamy czy użyszkodnik nie podał pustego hasła.
W liniach 13-15 dodajemy rozszerzenie .zip do nazwy pliku.
No a dalej już prosto, zipujemy i wyrzucamy komunikat o powodzeniu.
2
Skoro mamy już nasz magiczny skrypt, trzeba go teraz podpiąć pod menu podręczne w Eksploratorze. W tym celu musimy zmodyfikować rejestr systemowy, czyli tworzymy plik tekstowy z rozszeszeniem .reg oraz następującą zawartością:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\ZipWithPassword]
@="Zip z hasłem"
[HKEY_CLASSES_ROOT\*\shell\ZipWithPassword\command]
@="powershell.exe -ExecutionPolicy Bypass -File E:\\Dropbox\\code\\pass-zip\\pass-zip.ps1 '%1'"
Zwracam uwagę na ostatnią linijkę, w której wołamy nasz skrypt: pierwszy parametr, czyli %1, jest tutaj otoczony pojedynczymi cudzysłowami w razie gdyby folder z plikiem (albo nazwa samego pliku) zawierał spacje. To są właśnie te cudzysłowy, które usuwamy w trzeciej linii skryptu Powershell (sekcja 1 powyżej).
Plik zapisujemy i uruchamiamy podwójnym kliknięciem.
Uwagi końcowe:
-
Zamiast "Zip z hasłem" można w pliku
.regdać coś innego, co nie ma polskich liter. Z jakiegoś powodu nie potrafię nakłonić Windowsa do prawidłowego wyświetlenia literki "ł" -
Ten sam problem pojawia się przy zapytaniu o hasło (skrypt w Powershell nie wyświetla "ł")
-
Komunikat o sukcesie na końcu skryptu Powershell jest wyświetlony bardzo krótko, bo okienko polecenia od razu się zamyka. Można dać po tym jakieś
pausealbo coś bardziejszego. -
Można pomyśleć o jakimś bardziej zaawansowanym sposobie sprawdzania skuteczności hasła (ktoś może sobie za każdym razem wpisać hasło "a" i całe zabezpieczenie psu w dupę).
-
Eskplorator Windows zapamiętuje sobie tymczasowo hasła do plików zip, więc utworzenie tego samego pliku zip z tym samym hasłem w tej samej lokalizacji sprawi, że powtórna próba otwarcia tego pliku powiedzie się bez konieczności wpisywania hasła. Nie jest to wielki problem, ale warto o tym pamiętać.
-
"Nowe" Windowsy (czyli od 10 wzwyż) mają to kretyńskie menu podręczne "pierwszego stopnia", w którym pojawiają się opcje uznane (błędnie, ale co zrobisz) przez Microsoft jako najczęściej używane. Żeby wywołać "właściwe", "stare" menu podręczne (w którym siedzi nasza opcja "Zip z hasłem") trzeba wybrać "Show more options" z menu pierwszego stopnia. Pewnie jakoś da się dodać nasze zipowanie z hasłem do tego pierwszego menu (tak jak zrobił to na przykład Notepad++), ale już mi się nie chciało kombinować.
Komentarze