niedziela, 4 stycznia 2015

PowerShell cz.2 - Instrukcje warunkowe,Pętle

Im więcej kody tym lepiej jest zapisać go w postaci skryptu, jednak PS wymaga pewnych ustawień przed uruchomieniem skryptu. Więcej informacji dotyczących poniższych elementów znajdziemy na stronie WMI Class.

1. Konfiguracja

Uruchamiamy konsolę PS, wpisujemy

Set-ExecutionPolicy Unrestricted

Dzięki czemu możliwe będzie uruchomienie każdego skryptu. Możemy również zastosować:
-Restricted - całkowicie wyłączona możliwość uruchamiania skryptów,
-AllSigned -skrypty wymagają podpisania przez zaufanego dostawcę,
-RemoteSigned - skrypty pobrane z internetu wymagają podpisania

W większości przypadków uruchamiamy PS bez podwyższonych uprawnień, jednak niektóre skrypty będą wymagały uprawnień administratora. Zaznaczamy je:

  






2.Przykłady skryptów

#Skrypt generuje listę wszystkich plików o ProcessID różnym od 0, dla komputerów przekazanych #jako lista $args, wynik zapisuje do 3 różnych plików.

$args= "Acer","127.0.0.1","localhost" #tworzymy listę maszyn do sprawdzenia

foreach($i in $args) #sprawdzamy kazdy komputer z listy
{
$strFile = "c:\scripts\"+ $i +"_Processes.txt" # plik wyjściowy na listę procesów
Write-Host "Kompletuję informację o procesach dla " $i; # informacja do konsoli o postępach
Get-WmiObject -computername $i -class win32_process | #podepniemy się do klasy win32_process
Select-Object Name, ProcessID, Prioryty, ThreadCount, PageFaults, PageFileUsage | #wybieramy konkretne wiersze z klasy win32_process
Where-Object {!$_.ProcessID -eq 0} | Sort-Object -property Name | Format-Table | Out-File $strFile #wybieramy te obiekty, dla których ProcessID jest różny od 0, następnie sortujemy po Name, #oraz wszystko zapisujemy do pliku $strFile
}


Uruchamiamy skrypt, wpisując c:\scripts\Processes, poniżej zobaczymy kolejne kroki skryptu.



Wynikowe pliki zostaną zapisane w c:\scripts.


#-----------------------------------------------------------------------------------------------------------------
#Skrypt pokaże nam informacje na temat zamontowanych w naszym komputerze dysków
#* możliwe wartości dla intDriveType:
# 3-  dysk twardy
# 5-  napęd optyczny CD/DVD
# 2-  karty pamięci

$args = "Acer","localhost","127.0.0.1" #tworzymy listę maszyn do sprawdzenia
Set-Variable -name intDriveType -value 3 -option constant #ustawiany stałą intDriveType z wartościa 3 (taką wartość posiada zawsze dysk twardy*)
foreach($i in $args) # sprawdza dyski dla wszystkich komputerów
{
 "Dyski twarde na: " + $i
Get-WmiObject -class win32_LogicalDisk -computername $i | #podpinamy się do LogicalDisk
Where {$_.DriveType -eq $intDriveType} |Select-Object DeviceID, DriveType, FreeSpace, Size| Sort-Object -property DeviceID | Format-Table #wybieramy tylko dyski twarde(DriveType ma wartość 3), następnie wybieramy część wierszy, posortujemy po DeviceID, następnie wyświetlamy jako tabelka

}



#-------------------------------------------------------------------------------------------------------------------
#Jesteśmy w stanie przy pomocy skryptu wyciągnąć ID procesu, mając już pewną wiedzę możemy #dodać do tego skryptu również możliwość "zabicia" tego procesu.

$processName = "calc" #wpisujemy nazwę procesu
Get-Process |  # sprawdzamy czy na liście procesów występuje ten podany jak parametr 
foreach ( $_.name ) {
  if ( $_.name -eq $processName )
   {
       Write-Host "Identyfikator " $processName "jest równy: " $_.ID
   }

}

Stop-Process -name $processName -confirm #na koniec zakończymy proces , oczywiście z potwierdzeniem


#---------------------------------------------------------------------------------------------------------------------
#Następny skrypt pozwala na sprawdzenie przestrzeni adresowej sieci  po kątem działania w niej urządzeń w nią wpiętych.

[int]$intPing = 254 #liczba urządzeń do sprawdzenia
[string]$intNetwork = "192.100.100." #przeszukiwana przestrzeń adresowa

for($i=1; $i -le $intPing; $i++)
{
 $strQuery = "select * from win32_pingstatus where address = '" + $intNetwork + $i + "'" #wykonujemy ping dla kolejnych adresów IP
 $wmi = get-wmiobject -query $strQuery #zapisujemy wynik polecenia $strQuery

  if ($wmi.statuscode -eq 0)#jeżeli wynik jest = 0 urządzenie odpowiada na ping
  {
 Write-Host  "Ping " $intNetwork$i "działa" -foregroundcolor "green"#zaznaczamy wynik na zielono
  }
  else # w przeciwnym wypadku urządzenie nie odpowiada
  {
  Write-Host  "Ping " $intNetwork$i "nie działa" -foregroundcolor "red"#zaznaczamy wynik na czerwono
  }

}

#---------------------------------------------------------------------------------------------------------------------
#Kolejny skrypt sprawdza czy usługi są uruchomione, zatrzymane lub czy znajdują się w innym stanie

Get-Service |
Sort-Object status -Descending | #sortowanie od Z do A
foreach {
if  ( $_.Status -eq "stopped ") #sprawdzamy czy jest zatrzymana
{Write-Host $_.name $_.status -ForegroundColor red}
elseif ($_.Status -eq "running ") #sprawdzamy czy działa
{Write-Host $_.name $_.status -ForegroundColor green}
else  #sprawdzamy  czy jest w innym stanie
{Write-Host $_.name $_.status -ForegroundColor yelow}

}


#---------------------------------------------------------------------------------------------------------------------
#Możemy przy pomocy skryptu zidentyfikować jakiego rodzaju komputerem jest sprawdzana przez nas maszyna.

$wmi = get-wmiobject win32_computersystem #podpinamy się do klasy computersystem
Write-Host "Komputer " $wmi.name "to: "
switch ( $wmi.domainrole ) { #pobieramy numer z domainrole

    0 { "Autonomiczna stacja robocza" }
    1 { "Stacja robocza w domenie" }
    2 { "Serwer autonomiczny " }
    3 { "Serwer członkowski " }
    4 { "Zapasowy kontroler domeny " }
    5 { "Podstawowy kontroler domeny " }
    default { "Nie moge ustalić co to za urządzenie" }
}

#---------------------------------------------------------------------------------------------------------------------
#Zastosowanie switch do wyszukania wzorca w wyniku polecenia
#Skrypt pobiera wynik ipconfig /all do zmiennej, następnie szukamy w nim wyrażeń z bloku switch

$nicInfo = ipconfig /all
switch -wildCard ($nicInfo)
{
    "*Opis*"                   { Write-Host $switch.current }
    "*Adres fizyczny*"  { Write-Host $switch.current }
    "*Adres IPv6*"         { Write-Host $switch.current }
    "*Adres IPv4*"         { Write-Host $switch.current }
    "*Maska podsieci*"   { Write-Host $switch.current }
    "*Brama domyślna*" { Write-Host $switch.current }
    "*Serwery DNS*"      { Write-Host $switch.current }
 

}



#---------------------------------------------------------------------------------------------------------------------
#Zastosowanie regex do wyszukania wzorca w pliku
#W switch jako parametr przekażemy plik, jako źródło szukanego wyrażenia
# W pliku mamy 3 wiersze:
#Przykładowy tekst.
#Przykładowy test.
#Coś tam. 

switch -regex (${c:\scripts\test.txt}) {
'Przykładowy' { Write-Host $switch.current}

}

W wyniku otrzymamy wiersze, które zawierają szukane wyrażenie.



#---------------------------------------------------------------------------------------------------------------------
# Przekazywanie parametrów do skryptu z wiersza poleceń.
# Wszelkie parametry wykorzystane w skrypcie, można sprawdzić tutaj. Gdyby jakikolwiek parametr # nie działał możemy go zamienić - parametry w tabeli przy Type

Function argCmd($arg)
{
    Get-WmiObject win32_share -Filter "type = $arg" #wykonujemy polecenie z przekazanym parametrem
}

if (!$args)
{
 Write-Host "Podaj parametr dla skryptu:admin,print,drive,ipc,all" #jeżeli nie podamy parametry pojawi się powyższa linijka
}
else
{
  $arg=$args #przypisujemy podany argument do zmiennej, z którą wykonamy polecenie w fun
  switch ($arg)
  {
    "admin"  { $arg = 2147483648; argCmd($arg) } #pokaże udostępnienia ADMIN$,C$,D$
    "print"  { $arg = 1; argCmd($arg) }#pokaże udostępnione drukarki
    "drive"  { $arg = 0; argCmd($arg) }#pokaże udostępnione katalogi na komputerze
    "IPC"     {$arg=2147483651;argCmd($arg)}#udostępnione administracyjne
     "all"   { Get-WmiObject win32_share }#pokażemy wszystkie udostępnione elementy komputera
   }

}


W konsoli wpisujemy nazwę naszego skryptu z parametrem.

c:\scripts\nazwa_skryptu.ps1 admin/print/drive/IPC/all

Poniżej wyniki wywołań wszystkich poleceń w kolejności ze skryptu.




Brak komentarzy:

Prześlij komentarz