PowerShell jest potężnym narzędziem, które znacznie usprawnia i ułatwia pracę administratora. Pozwala na wprowadzenie setek czy tysięcy zmian kilkulinijkowym skryptem. Po przeczytaniu tego artykułu, dowiesz się jakie komendy oraz skrypty PowerShell są wykorzystywane najczęściej. Do każdej komendy podany jest przykład, którego być może użyjesz lub już użyłeś w praktyce.

Instrukcja ForEach lub ForEach-Object

Pętla jest nieoceniona przy działaniach na wielu obiektach. Pozwala na wykonanie akcji na każdym obiekcie z danej kolekcji. Warto dodać, że jeżeli używasz ForEach na początku wiersza, to jest to instrukcja. Umieszczając ją po pipeline, PowerShell traktuje ją jako alias do komendy ForEach-Object. Pokrótce komendy te różnią się szybkością oraz wykorzystaniem pamięci. ForEach jest szybsza, ForEach-Object wykorzystuje mniej zasobów. Brzmi skomplikowanie? W praktyce wygląda to dużo łatwiej. Dla przykładu:

#Skrypt zmieniający domenę w adresach mailowych wszystkich użytkowników w Active Directory.
#W tym przykładzie ForEach traktowana jest jako oddzielna instrukcja.

Import-Module ActiveDirectory
#Import modułu Active directory.
#Jest niezbędny do uruchomienia komend Get-ADUser oraz Set-ADUser.

$ADusers = Get-ADUser -Filter *
#Tworzenie kolekcji $ADusers. Zawiera ona wszystkich użytkowników w AD.


#Pętla foreach dla kolekcji $ADusers. Każdy pojedyńczy obiekt oznaczony jako $ADuser.
foreach ($ADuser in $ADusers)
{
    $email = $ADuser.samaccountname + '@domena.pl'
    #Tworzenie zmiennej $email. 
    #Zmienna zawiera nazwę użytkownika wraz z dodanym przyrostkiem @domena.pl. 
    #np. dla użytkownika jan.kowalski będzie to jan.kowalski@domena.pl.

    Set-ADUser -Identity $ADuser.samaccountname -EmailAddress $email
    #Ustawienie wyżej utworzonej zmiennej jako adres mailowy.

}
#Zawartość pętli wykona się dla każdego użytkownika w kolekcji $ADusers.

oraz

#Skrypt zmieniający domenę w adresach mailowych wszystkich użytkowników w Active Directory.
#W tym przykładzie użyję ForEach-Object.

Import-Module ActiveDirectory
#Import modułu Active directory.
#Jest niezbędny do uruchomienia komend Get-ADUser oraz Set-ADUser.

$ADusers = Get-ADUser -Filter *
#Tworzenie kolekcji $ADusers. Kolekcja zawiera wszystkich użytkowników w AD.

#Przesyłanie zawartości $ADusers do ForEach-Object za pomocą pipeline.
#W tym wypadku do identyfikacji pojedyńczego obiektu w kolekcji użyta jest zmienna $_ zamiast $ADuser.
$ADusers | ForEach-Object{

    $email = $_.samaccountname + '@domena.pl'
    #Tworzenie zmiennej $email. 
    #Zmienna zawiera nazwę użytkownika wraz z dodanym przyrostkiem @domena.pl. 
    #np. dla użytkownika jan.kowalski będzie to jan.kowalski@domena.pl.

    Set-ADUser -Identity $_.samaccountname -EmailAddress $email
    #Ustawienie wyżej utworzonej zmiennej jako adres mailowy.
    
}
#Zawartość pętli wykona się dla każdego użytkownika w kolekcji $ADusers.

Import-Csv / Export-Csv                       

Jak bardzo ograniczony byłby PowerShell bez możliwości zapisu oraz odczytu z pliku? Komendy Import-Csv / Export-Csv są rozwiązaniami do operacji na zewnętrznych danych, których używa się najczęściej. Import-Csv pozwala zaimportować dane z pliku CSV do naszego skryptu. Analogicznie Export-Csv wyeksportuje dane, zapisując je w formacie CSV.

Export-Csv:

#Skrypt eksportujący listę procesów do pliku CSV.

$process = Get-Process
#Tworzenie zmiennej $process.
#Zmienna zawiera listę procesów.

$process | Export-Csv -Path C:\temp\process.csv
#Przekazanie $process za pomocą pipeline | do komedy Export-Csv.
#Komenda Export-Csv zapisuje zmienną $process w lokalizacji C:\temp\ jako plik process.csv.

Import-Csv:

#Skrypt importujący numery telefonów z pliku csv.

Import-Module ActiveDirectory
#Import modułu ActiveDirectory.
#Jest niezbędny do uruchomienia komendy Set-ADUser.


$NumbersList = Import-Csv -Path C:\temp\numbers.csv
#Import pliku numbers.csv, znajdującego się w lokalizacji C:\temp\numbers.csv do $NumbersList.

#Rozpoczęcie pętli foreach.
#Pętla wykonuje się dla każdego wiersza w pliku numbers.csv.
foreach ($Number in $NumbersList){

Set-ADUser -Identity $Number.samaccountname -MobilePhone $Number.telephonenumber
#Przypisanie użytkownikowi w AD numeru telefonu z zaimportowanego pliku.

}

Plik numbers.csv:

"samaccountname","telephonenumber"
"test.user1","145345345"
"test.user2","123123123"
"test.user3","145445661"
"test.user4","125345345"
"test.user6","115213721"
"test.user7","155345345"
"test.user8","176876555"
"test.user9","122533345"
"test.user10","999999999"

Select-Object

Prosta i niezwykle przydatna komenda, która wybiera obiekt lub jego właściwości. W poniższym przykładzie wybierani są użytkownicy, którzy logowali się na swoje konto w ciągu ostatnich 30 dni. Interesuje Cię nazwa użytkownika oraz data ostatniego logowania. – Możesz uzyskać te właściwości właśnie za pomocą Select-Object.

#Skrypt wyświetlający nazwę konta oraz ostatnią datę logowania kont zalogowanych w ciągu ostatnich 30 dni.

Import-Module ActiveDirectory
#Import modułu Active directory.

$Date = (get-date).adddays(-30)
#Utworzenie zmiennej $Date.
#Zmienna zawiera datę 30 dni wstecz.

Get-ADUser -properties * -filter {(lastlogondate -ge $Date)} | Select-Object samaccountname,lastlogondate
#Wybranie kont, których lastlogondate jest późniejszy lub równy $Date.
#Dzięki Select-Object wynik zostanie wyświetlony w postaci:
#samaccountname lastlogondate
#konto1         01.01.2021 01:01:01
#konto2         02.01.2021 02:02:02
#...

Where-Object

Poprzez Where-Object, możesz wybrać interesujące Cię obiekty na podstawie ich atrybutów. Często funkcje komendy Where-Object przejmuje parametr filter. Wykorzystanie filtru znacznie skraca czas wykonania skryptu, lecz nie jest on dostępny dla każdej komendy. W takim wypadku z pomocą przychodzi Where-Object.

#Skrypt wyświetlający konta z departamentu "Test"

Import-Module ActiveDirectory
#Import modułu Active directory.

Get-ADUser -Filter 'Department -eq "Test"'
#Wybieranie kont za pomocą parametru -Filter

Get-ADUser -Properties Department -Filter * | Where-Object Department -eq 'Test'
#Wybieranie kont za pomocą Where-Object.
#W tym wypadku wynik polecenia Get-ADUser jest przesyłany do Where-Object za pomocą pipelne.

Get-ChildItem

Get-ChildItem zwraca pliki znajdujące się w podanych lokalizacjach. Za pomocą tej komendy możesz wyszukiwać pliki lub sprawdzać interesujące Cię właściwości. Poniżej przykład użycia:

#Skrypt wyświetlający zawartość folderu $path wraz z podfolderami.

$path = 'C:\test\*.*'
#W zmiennej path umieszczona jest lokalizacja, która będzie przeszukiwana.


Get-ChildItem -Path $path -Recurse
#Dzięki parametrowi -Recurse, zawartość folderu $path jest przeszukiwana wraz z podfolderami.

Najczęściej używane komendy różnią się w zależności od rozwiązań IT w środowisku pracy. Powyższa lista oparta jest na doświadczeniach administratora IT, pracującego na systemach Windows Server.  Podane przykłady skryptów, po przetestowaniu bez problemu można zastosować w środowisku produkcyjnym. Czy Ty także na co dzień korzystasz z PowerShell’a? Być może warto zastanowić się jakich komend używasz najczęściej?

Potrzebujesz wsparcia informatycznego? Support Online to firma outsourcingowa, która od ponad 20 lat świadczy kompleksowe usługi informatyczne dla firm. Nasze usługi świadczymy na terenie całej Polski oraz za granicą. Oferujemy nowoczesne rozwiązania oparte na naszej wiedzy i doświadczeniu:
helpdesk 24/7
serwery dedykowane
chmura prywatna
to tylko niektóre punkty z naszej oferty.

Zapraszamy do kontaktu!

Bartłomiej Róg
Administrator IT w Support Online