Pokazywanie postów oznaczonych etykietą PowerShell. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą PowerShell. Pokaż wszystkie posty

piątek, 5 stycznia 2024

PowerShell: Search-IP. Function that searches clipboard, files for IP Addresses, deduplicate and sort them

 Background

Very often I have need for fast search, deduplicate and sort IP addresses in data from different sources: pdf reports, articles, logs.
This should include addresses which are written in safe format, with dots in brackets, like: 
  • 192.168.0[.]1 
  • 192.168.0(.)1
This is no problem when you have log with ~10 addresses or so, but if you have log file with ~50k - ~100k this could be a problem.

Solution

The function named Search-IP (link do Github repository) which was written in PowerShell. 

How it works

There is diagram below which showing how function works divided into 3 steps:
  • Input,
  • Working,
  • Output
Logical diagram of the function's operation
Logical diagram of the function's operation

niedziela, 30 października 2022

PowerShell: zabawa z właściwościami obiektu

1. Filtrowanie właściwości obiektu wg fragmentu jego nazwy

W przypadku obiektów posiadających wiele właściwości przydaje się możliwość ich przeszukiwania wg fragmentu ich nazwy. Na przykład obiekt ma setki właściwości, ale chcemy wyświetlić wyłącznie te, które zawierają określone słowo.

WAŻNE!
Proszę zwrócić uwagę, że omawiane jest wyszukiwanie po nazwach właściwości, a nie ich wartościach.
Wyszukiwaniu po wartościach poświęcony jest punkt 2 tego wpisu.

Nazwy właściwości wyświetlane są po lewej stronie (na zielono), a ich wartości po prawej
Nazwy właściwości wyświetlane są po lewej (na zielono), a ich wartości po prawej stronie

Może to nie jest zbyt szczęśliwy wybór, ale przypuśćmy, że z komendy Get-Date chcemy wyświetlić wszystkie właściwości, które zawierają w swojej nazwie ciąg day.

czwartek, 28 kwietnia 2022

PowerShell: Generator adresów IP

Czasami zachodzi potrzeba wygenerowania listy adresów IP v4.
Powyższe kawałki kodu pozwalają na to. 
Obydwa robią to samo, z tym, że "wersja jednolinijkowa" może być uruchamiana zarówno z poziomu konsoli, jak i środowiska programistycznego, natomiast "Wersja do użycia w edytorze kodu" nie uruchomi się w konsoli. 
Można wybrać co komu potrzebne:
  • wersja jednolinijkowa jest bardziej wszechstronna, ale mniej czytelna, 
  • wersja czytelniejsza, ale do użycia tylko w edytorze kodu lub jako skrypt. 

Wersja jednolinijkowa

for ($i=1; $i -le 10; $i++){(Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString()}
W miejsce zaznaczonej na czerwono cyfry 10 wystarczy podać swoją wartość i powyższy jednolinijkowiec wygeneruje taką właśnie liczbę adresów IP. 

IP list generator
Wynik działania komendy generującej adresy IP

Wersja do użycia w edytorze kodu

Poniższy kod także generuje listę adresów IP v4, ale został sformatowany do używania jako skrypt w środowisku oraz jest bardziej czytelny.
$howMuchShouldBeGenerated = 10 #ile adresów ma zostać wygenerowanych
$IPs = @()
for ($i=1; $i -le $howMuchShouldBeGenerated; $i++){
    $IP = ""
    for ($j=1; $j -le 4; $j++){
        $oktet = (Get-Random -Minimum 1 -Maximum 255).ToString()
        $IP += $oktet
            if ($j -le 3){
                $IP += "."
            }
    }
    $IPs += $IP
}
$IPs
Proste, ale może komuś się przyda. 

wtorek, 22 marca 2022

PowerShell: Monitorowanie stanu usługi w konsoli i do pliku

W celu rozwiązywania problemu z jakąś usługą, może się przydać prosty monitoring polegający na sprawdzaniu jej statusu w podanym interwale czasowym.

Poniższy jednolinijkowiec wykonuje takie właśnie zadanie.

$serviceName = 'nazwa_usługi'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)"}

W powyższym kodzie proszę zwrócić uwagę na miejsca oznaczone na czerwono. Oczywiście 'nazwa_uslugi' to nic innego jak nazwa usługi, którą chcemy monitorować (nazwy usług można podejrzeć np. poleceniem Get-Service).

Z kolei cyfra 5 oznacza interwał czasowy w sekundach pomiędzy sprawdzeniami. 

Rezultat jego działania widać poniżej. 


Oczywiście monitorowanie na ekranie może się przydać we w miarę krótkim przedziale czasowym. Jeżeli zachodzi potrzeba monitoringu dłuższego okresu czasu, wystarczy rezultat powyższej komendy przekierować do pliku dodając kod, który zamieściłem poniżej na czerwono.

$serviceName = 'spooler'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)" | Tee-Object -file plik.txt -append}

poniedziałek, 21 marca 2022

PowerShell: Przeszukiwanie plików w folderze (i ewentualnie podfolderach) pod kątem określonego ciągu znaków

Informacje wstępne

Poniżej wklejam prostą komendę w PowerShellu, która pozwoli przeszukać wszystkie pliki tekstowe w folderze pod kątem podanego ciągu znaków. 

Przydatne zwłaszcza kiedy w gąszczu logów trzeba znaleźć określoną frazę.

Komenda

Wersja przeszukująca wszystkie pliki w folderze

Get-ChildItem -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Wersja z ograniczeniem przeszukiwania do plików *.txt

Get-ChildItem *.txt -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Wersja z ograniczeniem przeszukiwania do plików *.txt i rekursywnym przeszukiwaniem podfolderów

Get-ChildItem *.txt -Recurse -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Przykład działania

Do przeszukania poszły dwa pliki. Pierwszy ze słowami angielskimi, drugi z polskimi:

  • english_words_alpha.txt (link)
  • sjp.20220320.txt (link)
Obydwa znajdowały się w jednym folderze i chciałem w nich wyszukać wszelkie kombinacje mojego imienia, tj. "daniel". 

Użyłem komendy, która została podana powyżej, zaś poniżej screen przedstawiający rezultat obejmujący:
  • kolumna pierwsza: nazwa pliku,
  • kolumna druga: nr wiersza w którym ciąg został znaleziony,
  • kolumna trzecia: odnaleziony ciąg z wyróżnieniem szukanego tekstu.

Parsowanie plików w folderze pod kątem określonego ciągu
Wynik działania opisywanej komendy w PowerShellu

No i to w sumie tyle. Jedna linijka, a potrafi zaoszczędzić dużo czasu :)

sobota, 28 sierpnia 2021

PowerShell: wyświetlane 30 ostatnio zapisanych/ zmodyfikowanych plików w folderze i podfolderach

Przykładowa sytuacja.

Na Pulpicie macie dużo folderów w których jest dużo plików. Zapiszecie coś w którymś z tych podfolderów. Nie pamiętacie nazwy, ani folderu w którym plik został umieszczony. 

Wtedy nerwowość szukania zapisanego dokumentu staje odwrotnie proporcjonalnie do pozostałego czasu, czyli im mniej czasu, tym większe zdenerwowanie ;)

W takich sytuacjach może się przydać poniższy "jednolinijkowiec".

Get-ChildItem -Recurse -File | Select-Object -Property FullName, LastWriteTime | Sort-Object LastWriteTime -Descending | Select-Object -First 30

Jeżeli więc chcecie wyświetlić 30 ostatnio zapisanych / zmodyfikowanych plików na Pulpicie i jego podfolderach należy odpalić PowerShella, przejść na Pulpit i wkleić powyższy kod. 

Oczywiście zamiast przechodzenia do folderu i uruchamiania kodu, ścieżkę do przeszukania można podać poprzez parametr -Path dla polecenia Get-ChildItem. Również do tego polecenia można dodać parametr -Hidden, który spowoduje wyświetlanie także ukrytych plików.

Kod uzupełniony o te dwa parametry będzie miał zatem postać:

Get-ChildItem -Path "ścieżka_do_przeszukania" -Recurse -File -Hidden| Select-Object -Property FullName, LastWriteTime | Sort-Object LastWriteTime -Descending | Select-Object -First 30

Całkiem przydatna rzecz, zwłaszcza jeśli do przeanalizowania są dziesiątki folderów z tysiącami plików. 

czwartek, 19 sierpnia 2021

Włączenie na maszynie zdalnej Pulpitu Zdalnego za pomocą PowerShella

Jak włączyć Pulpit Zdalny na maszynie do której nie macie fizycznego dostępu, a jedynie poprzez PowerShella? 

Otóż w sposób jak poniżej (działa na Windows 10).

  • Nawiązanie zdalnego połączenia do komputera, na którym ma zostać uruchomiona opcja dostępu przez Pulpit Zdalny
    Enter-PSSession -ComputerName "nazwa_komputera" -Credential (Get-Credential)
  • Dodanie wpisu w rejestrze zezwalającego na dostęp za pośrednictwem Pulpitu Zdalnego
    Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0
  • Opcjonalnie. Jeżeli dostęp przez Pulpit Zdalny nie działa to prawdopodobnie należy puścić ruch przez firewalla:
    Enable-NetFirewallRule -DisplayGroup "*Pulpit zdalny*"
No i to w zasadzie tyle. Raptem trzy kroki, a ile radości :D

sobota, 9 stycznia 2021

Dodanie tekstu z przodu i tyłu ciągu znakowego / wartości liczbowej w Notepad++, PowerShell i Excel

Co robicie gdy macie potrzebę dodania do listy gotowych ciągów znaków (lub liczb) jakiegoś tekstu na początku i końcu? Dla przykładu chcielibyście z przodu tekstu dodać słowo "przód", a tyłu słowo "tył" (prawda, że jestem kreatywny? ;D) 

Ciąg znaków posiadany i oczekiwany
Macie Chcecie uzyskać
  • TEKST1111
  • TEKST2222
  • TEKST3333
  • TEKST4444
  • przód-TEKST1111-tył
  • przód-TEKST2222-tył
  • przód-TEKST3333-tył
  • przód-TEKST4444-tył

Pewnie jest wiele sposobów na wykonanie tego zadania, ale jeżeli akurat żaden z nich nie przychodzi Wam do głowy, to może któryś z poniższych Was poratuje.

Tekst jest napisany pobieżnie bardziej jako wskazówka, niż dokładny instruktaż. 

czwartek, 17 grudnia 2020

PowerShell: Poszukiwanie pliku według zadanej sumy kontrolnej

Mawia się, że potrzeba matką wynalazków, tak więc potrzebą moją było znalezienie na dysku pewnego pliku o określonej sumie kontrolnej. Pewnie są do tego narzędzia, pewnie nawet za darmo, ale jakoś tak bardzo nie chciało mi się szukać po Internecie, że napisałem sobie jednolinijkowca w PowerShellu. 

Wygląda jak poniżej:

Get-Childitem -File -Recurse -LiteralPath "c:\Windows\System32" -Force -ErrorAction SilentlyContinue | ForEach {if ((get-filehash -path $_.FullName -Algorithm MD5 -ErrorAction SilentlyContinue).Hash -eq "5DA8C98136D98DFEC4716EDD79C7145F") {Write-Host "This file has searched control sum:" $_.FullName}}

Miejsca zaznaczone na czerwono można dopasować do własnych potrzeb, czyli: 

  • ścieżkę folderu do przeszukania (działa rekursywnie). Można też podać cały dysk, ale wtedy będzie odpowiednio dłużej. 
  • algorytm. W powyższym przykładzie jest to MD5, ale można wybrać jeden z poniższych: 
    • SHA1, 
    • SHA256, 
    • SHA384, 
    • SHA512,
  • suma kontrolna poszukiwanego pliku.
Ważne!
Powyższy kawałek kodu nie sprawdzi plików, które są otworzone, bądź zablokowane.
Tak więc, kto zgadnie jaki plik powinna zwrócić powyższa komenda? :)

piątek, 6 listopada 2020

Powershell: obcinanie numeru portu z adresu IP

Gdy otrzymacie plik zawierający adresy IP z portami, które chcecie usunąć (np. 123.123.123.123:80), wystarczy użyć do tego poniższej komendy powershella:

Get-Content plik_zrodlowy.txt | ForEach-Object {$_ -replace ":\d+$","" } | out-file plik_wyjsciowy.txt

Wynikiem będzie plik wyjściowy zawierający wyłącznie adresy IP, już bez numerów portów. 

wtorek, 1 września 2020

Powershell: lista zainstalowanych dysków / pendrajwów

W celu wylistowania zainstalowanych dysków twardych oraz pendrajwów można użyć poniższej komendy Powershella:

Get-CimInstance -class Win32_DiskDrive -property * | select-object InterfaceType, Model, @{Name="Pojemnosc"; Expression={$_.Size / 1024MB}}, SerialNumber

Wynik powinien prezentować się jak poniżej:

Lista dysków / pendrajwów wylistowana przy pomocy Powershella

Polecam uwadze pewną ciekawostkę. Można by sądzić, że na powyższej liście dyski twarde od pendrajwów można odróżnić po użytym interfejsie. W końcu widać tam 2 urządzenia z interfejsem USB, więc są to zapewne pendrajwy. Pozostałe zaś, to pewnie dyski twarde. 

Tak nie jest. Pendrajwem jest także urządzenie Corsair Voyager GTX, które ma przypisany interfejs SCSI. Jest to pendrajw o pojemności aż pół terabajta (z jego testem możecie zapoznać się tutaj).

Piszę o tym ponieważ gdyby ktoś miał potrzebę wyfiltrowania powyższych wyników w celu wyświetlenia np. wyłącznie pendrajwów, to filtrowanie z użyciem interfejsu nie będzie tutaj najlepszym rozwiązaniem. 

niedziela, 14 czerwca 2020

Kopiowanie plików ze zdalnej maszyny Windows przy użyciu PowerShella

Czasami zachodzi potrzeba skopiowania plików ze zdalnej maszyny z systemem Windows przy użyciu innego rodzaju połączenia niż SMB, tudzież schowek Pulpitu Zdalnego. 

Wtedy można skorzystać np. z PowerShella. 

A jak się to odbywa?

Tak więc, kopiowanie odbywa się w dwóch etapach:
  1. Utworzenie sesji do zdalnej maszyny, czyli utworzenie połączenia, które potem zostanie wykorzystane. Samo utworzenie sesji niczym nie skutkuje, poza tym, że możemy skorzystać z tak utworzonej sesji w innych poleceniach.
  2. Właściwe kopiowanie plików z wykorzystaniem sesji utworzonej w pkt 1.
Tak to wygląda w teorii, a poniżej praktyka z komendami i komentarzami.

czwartek, 4 czerwca 2020

Get-UserLoggedOnRemoteComputer: czyli skrypt pokazujący użytkowników zalogowanych na zdalnych maszynach Windows

Potrzeba matką wynalazków - jak to się mawia. 

A skoro tak, to powstał skrypt, który pokazuje użytkowników zalogowanych na zdalnych maszynach Windows. 

Jego celem jest zorientowanie się, czy na zdalnych serwerach nie pozostała niewylogowana sesja pulpitu zdalnego, bez konieczności ponownego logowania się do każdego z nich. 

Ot na zasadzie, odpalam skrypt i już wiem gdzie mi wisi sesja. Wygląda to mniej więcej tak jak na poniższym screenie.

Screen z wynikiem działania skryptu Get-UserLoggedOnRemoteComputer
Wynik działania skryptu (wrażliwe dane zostały zamazane)

sobota, 28 marca 2020

PowerShell: Generowanie sum kontrolnych MD5 z plików znajdujących się w napędzie optycznym (i nie tylko)

Na podstawie Rozporządzenia Ministra Sprawiedliwości z dnia 11.01.2017r. w sprawie utrwalania obrazu lub dźwięku dla celów procesowych w postępowaniu karnym, dokonując tworzenia / kopiowania nośników w sądach, powinniśmy tworzyć razem z nimi odpowiednie Metryki Identyfikacyjne Nośnika w skład której, w pkt. 7, należy podać:

  • Nazwa i wersja oprogramowania użytego do wygenerowania sum kontrolnych
  • Użyty algorytm (jeżeli oprogramowanie używa więcej niż jednego algorytmu)
  • Sumy kontrolne
Jest do tego celu wiele programów, jak np. darmowy HashMyFiles.

Większość z nich wymaga jakiejś podstawowej obsługi, natomiast moim celem (poza ćwiczeniem PowerShella), było przygotować narzędzie bezobsługowe. 

Taki też jest skrypt, który do tego celu przygotowałem, noszący nazwę Get-ControlSumFromOpticalDrive i którego najnowszą wersję można pobrać z GitHuba.

Skrypt Get-ControlSumFromOpticalDrive otworzony w edytorze Visual Studio Code
Skrypt Get-ControlSumFromOpticalDrive otworzony w edytorze Visual Studio Code (prawda, że piękny? ;)
Wystarczy go uruchomić, a on odszuka napęd optyczny w systemie, przeskanuje go rekursywnie pod kątem plików i przygotuje listę sum kontrolnych. 

poniedziałek, 30 września 2019

Skrypt Powershell do testowania Stref Warunkowego Przesyłania Dalej w serwerach DNS - "Test-DNSConditionalForwarders"

Jeżeli zarządzacie serwerem DNS w którym macie dodaną strefę, bądź strefy, Warunkowego Przesyłania Dalej (ang. Conditional Forwarder), to może Was zainteresować skrypt w PowerShellu, który ułatwia proces zarządzania nimi.

Dlaczego taki skrypt?
Strefy Warunkowego Przesyłania Dalej zarządzane są "z palca", a to oznacza, że to administrator lokalnie zarządzający DNSem odpowiada za to jaką listę serwerów będzie dla niej utrzymywał.

Jeżeli więc Wasza organizacja "średnio" dba o przesyłanie lokalnym adminom informacji o tym jakie serwery powinny powinny się w jakiej strefie znaleźć, to po pewnym czasie może być tam bałagan polegający np. na tym, że część serwerów w strefie zmieniła swój charakter i np. nie pełnią już roli DNSów, lub część w ogóle przestała być dostępna.
Oczywiście może być też tak, że są strefy dla domen, które w ogóle przestały być wykorzystywane (w dużych sieciach VPN żadna nowość).

poniedziałek, 12 sierpnia 2019

Powershell - skrypt logujący status zasilacza UPS

Być może komuś przyda się skrypt, który pobiera status zasilacza UPS i wyświetla go w postaci tabelki na ekranie z możliwością logowania do pliku.

Dane na ekranie wyglądają jak poniżej:

-- Basic informations
Name: Back-UPS RS 500 FW:30.j5.I USB FW:j5
Chemistry: Lead Acid
-- measurements started
date       time     Availability BatteryStatus EstimatedChargeRemaining EstimatedRunTime
----       ----     ------------ ------------- ------------------------ ----------------
09.08.2019 20:58:40            2             2                       98              203
09.08.2019 20:58:50            2             2                       98              203
09.08.2019 20:59:00            2             2                       98              203
09.08.2019 20:59:11            2             2                       98              203
09.08.2019 20:59:21            2             2                       98              203
09.08.2019 20:59:31            2             2                       98              203
09.08.2019 20:59:41            2             2                       98              203
-- Measurements completed

Dane logowane do pliku oddzielane są tabulatorami, dzięki czemu całość jest całkiem przyjemna w analizie, a ponadto umożliwia łatwą wizualizację w Excelu.

Poniżej przykładowy wykres obejmujący 10 minutowy okres ładowania akumulatora w zasilaczu APC Back-UPS RS 500.

Dziesięciominutowy okres ładowania akumulatora w zasilaczu APC Back-UPS RS500 zwizualizowany na wykresie
Dziesięciominutowy okres ładowania akumulatora w zasilaczu APC Back-UPS RS500 zwizualizowany na wykresie

Po bardziej szczegółowe informacje dot. skryptu zapraszam na GitHub, gdzie znajdziecie jego najnowszą wersję.