Pchełki Powershell: kompresja z hasłem i menu podręczne

krótki URL: /Q2QPK

kategorie:Inne Pchełki, Pchełki
tagi:compress, explorer, kompresja, menu-podręczne, powershell, right-click-menu, windows-explorer, zip

Dziś będzie o tym, jak w Powershell zrobić sobie następującego cosia:

  1. Klikamy prawym myszem w dowolny plik w Eksploratorze

  2. Z menu wybieramy "zzipuj z hasłem"

  3. Dostajemy pytanie o hasło, wpisujemy hasło

  4. 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:

  1. 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

  2. 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 .reg dać 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ś pause albo 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