Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Podstawy PowerShella w praktyce

PowerShell to następca występującego w systemach Microsoftu popularnego i wciąż wykorzystywanego interpretera cmd.exe. Obecnie za pomocą PowerShella wykonać można każde działanie administracyjne co ułatwia i ujednolica pisanie skryptów.

Poniższy wpis skierowany jest do osób, które mają pewne doświadczenie z PowerShellem bądź programowaniem. Aczkolwiek osoby zaczynające swoją przygodę z tym narzędziem prócz wykorzystania podstaw PowerShella, będą mogły zdobyć wyobrażenie o możliwościach jakie niesie ze sobą jego zastosowanie. Niżej przedstawiam wybrane sposoby za pomocą, których z łatwością wyciągniemy przydatne informacje o stacjach roboczych czy kontach użytkowników. Pamiętać należy, że skrypty PowerShellowe zapisujemy z rozszerzeniem .ps1.

Wyciągamy MAC adres

Przykład skryptu, który sprawdza MAC adresy urządzeń sieciowych komputera widzianego w sieci. Wpierw umożliwiamy korzystanie z przestrzeni nazw System.Windows.Forms. Przyda się gdy będziemy chcieli wybrać listę komputerów do sprawdzenia z pliku tekstowego. Klasa OpenFileDialog pozwoli na wyświetlenie wygodnego okna wyboru pliku:

r   e   k   l   a   m   a


Add-Type -AssemblyName System.Windows.Forms

W skrypcie zostanie zawarte proste menu wyboru akcji. Poszczególne akcje będą odwoływały się do zdefiniowanych wcześniej funkcji. Na pierwszy ogień idzie odczytywanie MAC adresu. Definiujemy funkcję:


function macaddr{
  $komp = Read-Host 'Podaj nazwe komputera:'
  write-host ""
  Write-Host "MAC adres komputera $komp to:"
  getmac /S $komp
  write-host ""
  Write-Host "Wciśnij cokolwiek by kontynuować";
  cmd /c pause | out-null
}

Funkcja zakończona jest szybkim poleceniem cmd, które wyświetla monit "Press any key to continue . . ." (w zależności od języka systemu) - po wciśnięciu dowolnego przycisku okno skryptu zostanie zamknięte. Można to zrealizować w bardziej elegancki sposób, jednak wywołanie polecenia przez powłokę cmd.exe jest po prostu szybkie. PowerShellowi puryści zapewne zamiast "getmac" będą woleli wykorzystać "Get-NetAdapter" by osiągnąć zbliżony efekt.

Oczywiście jeżeli wciąż upieramy się przy PowerShellu nic nie stoi na przeszkodzie by z niego skorzystać. Efekt będzie ten sam gdy ostatnią linijkę zastąpimy poniższym fragmentem:


Write-Host "Wciśnij cokolwiek by zakończyć..."
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()

Explorer w służbie PowerShella

Teraz definiujemy funkcję, która otworzy okno explorera w celu wyboru pliku z nazwami (adresami) komputerów. W międzyczasie ustalamy by w oknie wyświetlane były jedynie pliki z rozszerzeniem .txt:


function plik($initialDirectory){
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $OpenFileDialog.initialDirectory = $initialDirectory
    $OpenFileDialog.filter = "TXT (*.txt)| *.txt"
    $OpenFileDialog.ShowDialog() | Out-Null
    $OpenFileDialog.filename
}

Menu wyboru i właściwy skrypt

Teraz budujemy proste menu wyboru:


do{
  do{
    write-host "Co chcesz zrobić?:"
    write-host "1. Sprawdzić MAC komputera:"
    write-host "2. Sprawdzić MAC wielu komputerów:"
    write-host "3. W sumie juz nic."
    write-host "Wybierz mądrze:" 
    write-host ""
    $wybor = read-host
    $ok = $wybor -match '^[123]+$'
    if(-not $ok){write-host "Podaj 1, 2 lub 3"}
  }
  until($ok)
  switch -Regex ($wybor){
  "1"{
    write-host ""   
    macaddr
    write-host ""
    break
  }
  "2"{
    write-host ""
    $pliczek = plik "C:\"
    $komputery = get-content $pliczek
    foreach($i in $komputery){
      Write-Host "MAC adres komputera $i to:"
      getmac /S $i
      write-host ""
    }
  }
}
}until ( $wybor -eq "3" )

Jak działa powyższy skrypt? Po wyświetleniu na ekranie możliwych opcji przypisujemy do zmiennej "wybor" za pomocą "read-host" to co wpisze użytkownik. Za pomocą warunku if, wyrażeń regularnych i zmiennej "ok" sprawdzamy czy użytkownik podał dopuszczoną przez nas wartość - w tym przypadku skrypt akceptuje jedynie liczby 1, 2 lub 3.

Wyrażeie "switch" sprawdza nasz wybór, a następnie uruchamia jedną z dopasowanych opcji. Po wybraniu "1" odpalana jest zdefiniowana wcześniej funkcja "macaddr". Wybierając bramkę numer "2" otwiera się okno explorera, w którym wskazujemy plik tekstowy z listą komputerów (adresów) do sprawdzenia. W ww. pliczku każdy kolejny wpis powinien znajdować się w nowej linii. Opcja "3" szybko kończy pracę.

Oczywiście za pomocą "wmic" możemy wyciągnąć więcej informacji niż MAC adresy kart sieciowych. Można je równie łatwo wkomponować w przedstawiony wcześniej skrypt.

Ostatni zalogowany użytkownik

Poniższe polecenie sprawdzi kto jest obecnie zalogowany w systemie. Musimy się jedynie zatroszczyć by skrypt posiadał przypisaną wartość do zmiennej "komputer". Ew. na sztywno podajemy nazwę komputera bądź jego adres w sieci lokalnej:


wmic /node:$komputer computersystem get username

Bios i numer seryjny sprzętu

Jak wyciągnąć informacje takie jak numer seryjny komputera? Nic prostszego:


get-wmiobject -class win32_bios -computername $komputer

Powyższe polecenie wyświetli również producenta, wersję biosu czy jego nazwę jeśli taką nadano.

Wysyłamy pocztę

Możemy również wysłać do siebie maila z zebranymi informacjami.


$nadawca = "adres@nadawcy.pl"
$odbiorca = "adres@odbiorcy.pl"
$temat = "tutaj powinien znaleźć się temat wiadomości"
$tresc = "a tutaj jej treść"
$serwer_smtp = "adres.serwera.smtp"

Send-MailMessage -SmtpServer $serwer_smtp -From $nadawca -To $odbiorca -Subject $temat -Body $tresc

Zmiana haseł użytkowników

Na koniec pokażę jak w prosty posób odblokować konto użytkownika i zmienić jego hasło:


function uzytkownik{
    $uzytkownik=$uzytkownik1
    $q=dsquery user "OU=JednostkaOrganizacyjna,DC=domena,DC=pl" -name $uzytkownik
    $q=$q | Out-String
    if($q -eq "")
    {
        Write-Host "Brak użytkownika w domenie"
    }
    else
    {
        dsmod user "CN=$uzytkownik,OU=JednostkaOrganizacyjna,DC=domena,DC=pl" -pwd "nowe_haslo" -disabled no 
        Write-Host "Konto dla użytkownika $uzytkownik odblokowane, hasło: nowe_haslo"
    }
}

Siły zbrojne PowerShell Master Race zamiast "dsmod user" użyją pewnie "Set-ADUser".

Teraz możemy pobrać zawartość pliku z kontami użytkowników i odblokować je oraz zmienić hasło hurtem:


$pliczek = Get-Content "C:\sciezka\do\pliczku.txt"
foreach($uzytkownik1 in $pliczek){  
  uzytkownik
}

Ścieżkę do pliku możemy podać na sztywno ale równie dobrze sprawdzi sie zaprezentowana wcześniej funkcja "plik".

Oczywiście na tym możliwości PowerShella się nie kończą. Mam nadzieję, że powyższym wpisem zachęciłem kogoś do eksperymentowania ze skryptami. Ogranicza nas jedynie czas i wyobraźnia. 

windows porady programowanie

Komentarze