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

https://xpil.eu/Q2QPK

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

https://xpil.eu/Q2QPK

6 komentarzy

    1. Dla użytkowników technicznych to proste, nietechniczni potrzebują rozwiązania możliwie najprostszego. Czym mniej kliknięć, tym lepiej. Dlatego muszę jeszcze wykumać jak się dostać do tego pierwszego menu podręcznego. To znaczy jak mi się będzie chciało 🙂

  1. Ostatnio bardziej preferuję PeaZIP nad 7-zip, gdyż ich GUI pozwala m.in. wyklikać by po spakowaniu usunąć pliki orginalne.

  2. Coś moi ludzie od IT pokombinował i i będę musiał poselstwa do nich słać. Wyłączyli mi przez active directory dostęp.
    Ale poćwiczę w domu tymczasem. Dzięki.

  3. A jeśli chodzi o różne umiejętności biurowe, to zbyt wiele rzeczy wydaje się wam zbyt oczywistych 😁, czasem mam poczucie, że świat wygląda zupełnie inaczej niż ja go widzę. Dwa proste przykłady:
    osoba imię i nazwisko znane redakcji miała w excelu kilka kolumn. w jednej z nich poscalała po 2- 3 wiersze i pyta osoby obok, jak to teraz posortować. W czasie gdy tamta się zastanawiała, ta postanowiła dokończyć scalanie i dopiero wróci do sprawy sortowania. 30 lat pracy biurowej.
    Nie wtrąciłem się nawet wtedy, gdy się okazało że głupi program i trzeba jednak to scalenie wycofać. Oczywiście komórka po komórce, pojedynczo.
    Jakiś pomysł na dyplom?
    Drugi to mój sąsiad. Mniej więcej raz w miesiącu przychodzi do mnie żeby naprawić internet, bo mu się okno przeglądarki przesunęło w prawo i nie ma dostępu do tego przycisku zamknij. Ale jemu akurat wolno. Jego ruszyć nie dam 👍

  4. A w sprawie jedynie słusznego menu: już dawno wywaliłem je ze wszystkich kompów, na których pracuję. Być może gdzieś jest możliwość samodzielnego komponowania takiego menu – jest rzeczą niepojętą, jeśli nie ma nad tym kontroli, opcja “wyślij do adresata” przemawia wprost do samego centrum mojego lenistwa.

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.