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:

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

0 nowych
wielkipiec   13 #1 11.04.2016 22:22

Dear god. Jak ktoś szuka podstaw jakiegoś języka, to przychodzi poczytać o zmiennych i pętlach, na początek. A nie o wyświetlaniu formatek WF i zmianie haseł w Active Directory (jednocześnie?).
Hint: określ najpierw, co chcesz przekazać pisząc takie wprowadzenie. Bardzo często blogerzy piszą wpisy np "kilka fajnych pomysłów w PS, które ostatnio wymyśliłem" i załączają snippety, właśnie takie jak ty wyżej. To ma dużo sensu, bo ładnie się googluje i w założeniu nie jest serią. Polecam ci takie podejście, choćby dla własnej pamięci! Sam szukając jakichś snippetów wracam z google... z własnymi pomysłami, które kiedyś napisałem i zapomniałem na śmierć :D
Tutaj, hm... Wyobraź sobie, że chcesz poczytać o podstawach Pythona. Jakbyś znalazł wpis, który przedstawia go w taki sposób, uznałbyś go za wartościowy?

Berion   13 #2 11.04.2016 22:25

Oczy bolą jak się patrzy na tę składnię. Jak można lubić PS?

Autor edytował komentarz w dniu: 11.04.2016 22:26
chmod700   7 #3 11.04.2016 22:29

@wielkipiec: Fakt, może za daleko z tym popłynąłem. To poniekąd "zasługa" tego, że z PS-a korzystałem w miarę regularnie od jakiegoś czasu. Jakby nie patrzeć nie są to rzeczy szczególnie zaawansowane w porównaniu do możliwości jakimi dysponuje PS. Zresztą tytuł jasno mówi o tym, że chodzi o wykorzystanie podstaw w praktyce. Początek poprawiłem, dzięki i pozdrawiam.

Autor edytował komentarz w dniu: 11.04.2016 22:58
wielkipiec   13 #4 11.04.2016 22:38

@Berion: to i tak awans względem VBS (którego również lubię :D )

bachus   20 #5 11.04.2016 22:50

@Berion: lubić go za bardzo nie można - ale ma tą zaletę, że zapewnia pełną administrację Windows 2012 (w 2012 GUI jest nakładką na PS i sporo rzeczy już trzeba robić tylko w PowerShell). Dla osoby "wychowanej" na *nix (w tym mnie) może być udręką, że trzeba się ostro "napałować" nad rzeczami oczywistymi jak ||, czy &&. Nigdy nie zrozumiem po co na nowo wynajdować koło i nie brać garściami ze sprawdzonych rozwiązań...
Co do samego PS - w stosunku do CMD i VBS ogromna różnica.

Autor edytował komentarz w dniu: 11.04.2016 22:50
AL|EN   2 #6 11.04.2016 23:27

popieram wielkipiec, od siebie oddam, że masz błąd w ostatniej linii ($choice > $wybor), składnia jak z języka programowania a nie skryptowego, niedozwolone łączenie narzędzi cmd z powershellem (cmd /c pause | out-null WoTeFack? To nie zadziała w ISE), MAC adresy dostaniemy poprzez: Get-NetAdapter

Co do "pałowania" i "wymyślania koła na nowo" - to co sprawdza się w bash'u i rzeczach unix'owych nijak się ma to ekosystemu i technologii windowsa dlatego są nowe rzeczy dostosowane do tego.

Zresztą jeżeli porównujemy języki stricte skryptowe to Powershell zjada bash'a i shell'a na śniadanie - wystarczy jedno: obiektowość :)

Autor edytował komentarz w dniu: 11.04.2016 23:34
bachus   20 #7 11.04.2016 23:46

@AL|EN: mimo tego, że PS to potężne narzędzie w świecie Windows, to mimo kolejnych wersji ma swoje za paznokciami... Mnie dość mocno dziwi niechęć administratorów do PS - mieć narzędzie z klasami/metodami w języku skryptowym i marudzić?

eklime   2 #8 11.04.2016 23:59

Co to to ma być tam powyżej? No jaki jest sens pisania skryptów/składni PowerShell aby wywoływać komendy typu dsmod (zamiast Set-ADUser) czy getmac (zamiast Get-NetAdapter). Co wnosi ten wpis? Początkujący użytkownik niebieskiej konsoli nie zrozumie prawie nic, zaawansowany - łapać się za głowę będzie. Dodatkowo co to za zmienne q, ok, komp - gdzie zasady używania jednoznacznie określających funkcję nazw zmiennych i to najlepiej w języku angielskim. Takie skróty to można sobie w zaciszu domowym a nie w publicznym wpisie stosować!
A i PowerShell nie jest językiem skryptowym z tego co słyszałem gdzieś na mieście ;)

Berion   13 #9 12.04.2016 01:00

@bachus/@wielkipiec: CMD ubogi wiadomo, VBS w ogóle nie znam. Na szczęście nie zawiaduję serwerami, więc ta wątpliwa przyjemność używania PS mnie omija. Kiedyś, kiedy to była jeszcze nowość, a internet zalała fala optymizmu, jaki to ten PS nie jest potężny, a jaki CMD przestarzały (co jest faktem, nie neguję) usiadłem do PS i prawie krew mnie zalała. Pewnie stąd mam taką awersję. ;)

jakubm87   3 #10 12.04.2016 08:09

Przeglądałem kiedyś książki znalezione w internecie do PS. Cała ta obiektowość, rozbudowane nazwy funkcji są mniej przyswajalne niż Bash. Zdecydowanie wolę Basha, a do zadań wymagających bibliotek i bardziej zaawansowanego programowania Pythona. Na szczęście z Windows korzystam tylko na desktop i nie muszę w tym programować. Co nie zmienia faktu, że narzędzia MS-a są dobre, funkcjonują na innych zasadach niż Unixowe. Po przyzwyczajeniu się - dobrze się pracuje i można w miarę szybko znaleźć rozwiązania problemów.

kadet90   5 #11 12.04.2016 11:17

Szczerze? Liczyłem na jakiś dobry wpis o powershellu, który naprawdę jest fajnym shellem, choć wymaga zmiany pewnych przyzwyczajeń. A tak na prawdę mamy wpis, który jest raczej antyprzykładem, bo tego nie powinno się robić.Jeżeli chcemy zarządzać Windowsem - to w pełni spod powershella, nie ma sensu wykorzystywać do tego innych narzędzi, bo w sumie tracimy wszystko co fajne, całą obiektowość itd. PS nie powinien być (choć może) stosowany jako język do pisania prostych aplikacji, jak ktoś używa powłoki to dużo łatwiej mu wpisać ścieżkę (zwłąszcza jak używamy psreadline) w argumencie niż wyklikiwać w okienku.

bystryy   10 #12 13.04.2016 09:15

Fajny ten PS, tylko w porównaniu z bashem wydaje się cholernie trudny. Może jestem mało wymagający, ale póki co pod Windowsem cmd mi starcza.

edmun   12 #13 18.04.2016 14:30

" PowerShellowi puryści zapewne zamiast "getmac" będą woleli wykorzystać "Get-NetAdapter" by osiągnąć zbliżony efekt." jest powtórzone

chmod700   7 #14 18.04.2016 14:49

@edmun: thx, poprawione.