6 sposobów pobierania danych w PowerShell

By Podstawy, PowerShell

6 sposobów pobierania danych w PowerShell

Większość automatyzacji, funkcji i skryptów PowerShell opiera się na danych wejściowych. Dane to procesujemy w najróżniejszy sposób – sprawdzamy, oczyszczamy, porównujemy, wzbogacamy, aby na wyjściu podjąć odpowiednie działania.

Najczęstszym sposobem wprowadzania danych do funkcji jest określanie wartości parametrów. Często jednak potrzebujemy danych z różnych źródeł w masowej ilości.

Dlatego poniżej 6 poleceń/skryptów PowerShell do pobierania danych z sześciu różnych lokalizacji.

1. Dane z pliku CSV

CSV (comma-separated values) jest plikiem z wartościami odseparowanymi przecinkami. Sporo systemów i aplikacji umożliwia eksportowane danych do takiego formatu. Bez większego problemu dane z Microsoft Excel czy Google Sheet zapiszesz do pliku z rozszerzeniem .csv.

W takim pliku wartość każdej kolumny zostanie odseparowana przecinkiem, natomiast każdy nowy wiersz znajdzie się w nowej linii.

Prosta struktura CSV pozwala na samodzielne tworzenie takich plików. Wykorzystać w tym celu możesz, chociażby najprostszy notatnik.

przykladowy plik csv

Pliki CSV bardzo często stosuję jako wsad to operacji masowych, np. skanowanie określonej listy maszyn wirtualnych albo operację na obiektach w Active Directory.

Zobaczmy przykład wykorzystania natywnych poleceń PowerShell do pobrania danych z CSV.

<# 
ComputerName, Environment
serv1, test
db-server, prod
app-test, test
#> 
 
Import-Csv -Path C:\Temp\file.csv
# lub
Get-Content -Path C:\Temp\file.csv | ConvertFrom-Csv
PowerShell - pobieranie z pliku csv

2. Pobieranie danych z pliku JSON

Pliki JSON (JavaScript Object Notation) jest kolejnym prostym i popularnym formatem wymiany danych,  Zarówno zapis i odczyt danych w tym formacie jest łatwy do opanowania.

Pliki JSON warto rozważyć jako parametry konfiguracyjne dla skryptów. Tym bardziej, że od PowerShell 3.0 wprowadzono natywne polecenia do pracy z plikami w formacie json.

Wykorzystaj polecenie ConvertFrom-Json do konwersji zawartości pliku do obiektu.

# przygotowanie pliku json
'{
    "TEST": {
        "Environment": "TEST",
        "ComputerName": ["server-test-1", "server-test-2"],
        "SqlInstance": "server-test-db-1",
        "httpPort": 8081,
        "httpsPort": 443,
        "logsPath": "D:\\log"
    },
    "PROD": {
        "Environment": "SUP",
        "ComputerName": ["server-sup-1", "server-sup-2"],
        "SqlInstance": "server-sup-db-1",
        "httpPort": 8082,
        "httpsPort": 443,
        "logsPath": "D:\\log"
    }
}' | Out-File -FilePath C:\Temp\settings.json
 
$Settings = Get-Content -Path C:\Temp\settings.json | ConvertFrom-Json
$Settings.TEST
PowerShell - pobieranie z pliku json

3. Pobieranie z bazy danych

Jeśli mowa o danych to nie mogło zabraknąć po prostu baz danych. W PowerShell nic nie stoi na przeszkodzi, aby pobierać (ale też zapisywać) i przetwarzać dane z relacyjnych baz danych np. SQL Server.

Trzeba zaznaczyć, że PowerShell to sposób nawiązania połączenia, natomiast do określenia danych potrzebnych z bazy danych użyjesz deklaratywnego języka SQL.

Poleceń do tego typu operacji nie ma natywnie w PowerShell, dlatego polecam zainstalować moduł SqlServer lub dbatools.

W przykładzie wykorzystuję polecenie Invoke-DbaQuery z modułu dbatools do pobrania kolumn SystemName, Name, Locked, LoginFailures z tabeli dbo.User, gdzie wartości kolumny Locked są równe 1.

$param = @{
    SqlInstance  = 'serwer-sql' 
    Database = 'ExampleDB'
    Query =  "SELECT SystemName, Name, Locked, LoginFailures FROM dbo.Users WHERE Locked = 1"
}
Invoke-DbaQuery @param
 
<#
SystemName    Name Locked LoginFailures
----------    ---- ------ -------------
     86166  161561   True             2
     85067  159501   True             0
    106890  200418   True             2
     82272  154260   True             1
    106365  199435   True             0
     79398  148872   True             0
#>

4. Pobieranie danych z REST API

Wiekszość nowoczesnych systemów umożliwia bezpośrednią łączność pomiędzy aplikacjami za pomocą application programming interface, czyli API.

Pobieranie danych z systemu przez API jest jedną z częściej spotykanych funkcjonalności. Oczywiście przed skorzystaniem z jakiegokolwiek API warto zapoznać się z dokumentacją (to sporo uprości).

Za pomocą natywnego polecenia Invoke-RestMethod (dostępnego w PowerShell 5.1 oraz 7.0) wyślesz zapytanie do REST API.

Zobacz przykład zapytania do API o wszystkie hosty, które istnieją w Zabbix.

# # https://www.zabbix.com/documentation/3.0/manual/api
 
# na początku musimy zalogować się do API w celu wygenerowania i pobrania tokenu
# https://www.zabbix.com/documentation/3.0/manual/api/reference/user/login
 
$AddressToAPI = 'https://test-zabbix/api_jsonrpc.php' 
$RequestUserLogin = '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "username",
        "password": "passwordZabbix"
    },
    "id": 1
}'
 
($Token = Invoke-RestMethod -Method POST -Uri $AddressToAPI -Body $RequestUserLogin -ContentType "application/json")
 
# Metoda pozwala na pobieranie hostów zgodnie z podanymi parametrami.
# https://www.zabbix.com/documentation/3.0/manual/api/reference/host/get
$RequestHostGet = '{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
 
    },
    "auth": "' + $Token.result+'",
    "id": 1
}'
 
($Hosts = Invoke-RestMethod -Method POST -Uri $AddressToAPI -Body $RequestHostGet -ContentType "application/json")
($Hosts).result | Select-Object hostid, name, host

Inny przykład to odpytanie publicznego API Wykazu podatników VAT wystawionego przez Ministerstwo Finansów.

$param = @{
    Method = 'Get'
    Uri = 'https://wl-api.mf.gov.pl/api/search/nip/5270103391?date=2020-07-07' 
    ContentType = 'application/json'
}
(Invoke-RestMethod @param).result.subject
PowerShell and Invoke-RestMethod

5. Pobieranie danych z strony WWW

PowerShell również nadaje się do pobierania danych ze stron internetowych, tzw. web scrappingu. Poniżej przykład pobrania wszystkich nagłówków drugiego stopnia (h2) z Akademii PowerShell.

PowerShell web scrapping
$ContentAP = Invoke-WebRequest 'https://akademiapowershell.pl'
($ContentAP.ParsedHtml).getElementsByTagName('h2') | Select innerText

Tutaj znajdziesz przykład funkcji, którą napisałem jakiś czas temu do pobierania informację z otoDom.

W PowerShell 7 polecenie Invoke-WebRequest nie parsuje strony www, dlatego funkcja nie zadziała poprawnie. Do tego typu operacji w PowerShell 7 możemy skorzystać np. z modułu PowerHTML.

6. Pobieranie z Active Directory

W średnich i dużych firmach cieżko nie znaleźć usługi katalogowej Active Directory. Jest to spora składnica danych o obiektach takich jak użytkownicy, stacje roboczę oraz serwery.

W celu pobierania danych z Active Directory mamy dedykowany moduł PowerShell, którym przeszukamy, wyciągniemy, zmodyfikujemy dane.

Przykładowe polecenia pobrania danych z Active Directory za pomocą PowerShell.

# Pobranie grup domenowych zgodnych filtrem
Get-ADGroup -Filter "Name -like '*DB*'"
 
# Pobranie użytkowników, których konta są wyłączone 
Get-ADUser -Filter "Enabled -eq 'False'" 
 
# Pobranie wszystkich członków grup zgodnych z filtrem
Get-ADGroup -Filter "Name -like 'FL*DB*'" | Foreach { Get-ADGroupMember -Identity $_.Name }

Podsumowanie

To było 6 różnych (i chyba najpopularniejszych) sposobów na pobieranie danych za pomocą PowerShell.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

2 Responses to " 6 sposobów pobierania danych w PowerShell "

  1. Arek pisze:

    Skoro został poruszony temat Zabbix to nie mogę się powstrzymać, by dodać swoją uwagę 🙂
    teoretycznie z wykorzystaniem powershell można w ten sposób zagregować dane z Zabbixa i przedstawić je dalej w interesującej nas formie. Np. za pomocą specjalnego widoku.
    Mimo wszystko, jeżeli ktoś chce w ten sposób tworzyć jakieś bardziej zaawansowane wykresy lub widoki to polecam Grafanę.
    Jak ktoś już zna powyższy sposób na komunikację z API Zabbixa to w analogiczny sposób można połączyć Zabbixa z Grafaną. Polecam. Bardzo fajne narzędzie analityczne. Do tego za darmo.

    • Mateusz Nadobnik pisze:

      Arek, dzięki za komentarz. Jak najbardziej zgodzę się, że Grafana to fajne narzędzie do wizualizacji i budowania dashboardów na podstawie danych z Zabbixa (ale nie tylko). PowerShell w takim celu to nie najlepszy pomysł.
      Jednak do automatyzacji lub integracji z Zabbixem, Powershell sprawdza się w moim przypadku genialnie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close