Pozdravljeni! Želim deliti preprost navodila 'Kako prenehati ročno pingati deset gostiteljev. Brez registracije in SMS!'.
Iz globin interneta
Pomembno: nisem programer in nisem sistemski administrator, a moram hkrati delati z obsežnim nizom strežnikov in storitev, to skripto sem napisal za lastno udobje.
Vse, ki bi jim to lahko bilo koristno, vabim pod objavo.
Zakaj PowershellImam izkušnje s pisanjem preprostih programov v Pythonu, vendar zahteva bodisi nameščen interpreter bodisi pravice za zagon .exe, kar v okviru mojega dela ni vedno mogoče. Skripta na Powershellu pa pogosteje najde možnost zagona.
Niso vsi ljubitelji konzole/terminala
Mislim, da v tem ni protislovja, sicer bi vsi še vedno uporabljali konzolne e-poštne odjemalce in v *nix sistemih ne bi pojavili GUI.
Ker moram v vsakdanji rabi uporabljati Powershell dokaj enostavno, sem na začetku poskušal razumeti, ali ga je mogoče povezati z GUI. Izkazalo se je, da lahko, celo dokaj preprosto:

Add-Type -assembly System.Windows.Forms #Povežemo knjižnico
$main_form = New-Object System.Windows.Forms.Form #Ustvarimo objekt z našim 'oknom'
#Določimo njegove parametre
$main_form.Text ='Povezave gor' #Ime v naslovu
$main_form.Width = 300 #Širina okna
$main_form.Height = 200 #Višina okna
$main_form.AutoSize = $true #Damo mu možnost, da samodejno spremeni velikost, če je potrebno
$main_form.ShowDialog() #Pokličemo 'okno'
Dodajamo temu izhodni element in dobimo osnovno Windows okno, pleonazem?.

Add-Type -assembly System.Windows.Forms # Vključimo zbirko
$main_form = New-Object System.Windows.Forms.Form # Ustvarimo spremenljivko z našim "oknom"
# Nastavimo mu parametre
$main_form.Text ='Links up' # Ime v naslovu
$main_form.Width = 300 # Širina okna
$main_form.Height = 200 # Višina okna
$main_form.AutoSize = $true # Omogočimo samodejno prilagajanje velikosti, če je potrebno
$Label = New-Object System.Windows.Forms.Label # Vse elemente obrazca bomo shranili v spremenljivke, vendar so dejansko objekti, kot katere koli druge spremenljivke v Powershell
$Label.Text = "Pozdravljeni! Sem osnovno Windows okno, kaj si dosegel ti?" # Izpisano besedilo
$Label.Location = New-Object System.Drawing.Point(10,65) # Lokacija objekta znotraj okna (x,y)
$Label.AutoSize = $true
$main_form.Controls.Add($Label) # Dodamo ustvarjeni objekt oknu, da se ne izgubi med izvajanjem skripta
$main_form.ShowDialog() # Prikažemo osnovno oknoDodajmo dinamiko
Orodje, s katerim sem "pingal Yandex" in montiral *.iso, je zdaj dobilo ločen GUI, vendar to ni dovolj. Na podoben način lahko prikažemo informacije o dostopnosti, vendar bo treba skript vsakič znova zagnati.
Najprej bomo narisali dve ikoni in dodali možnost prikaza slik.

$PictureBox = New-Object system.Windows.Forms.PictureBox #Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)
#Tutaj przechodzimy do rzeczy, wiążemy wyświetlany obrazek z wynikiem sprawdzenia dostępności węzła za pomocą polecenia
#<b>test-connection</b>, gdzie:
#-Count - przekazuje liczbę żądań
#-computer - adres IP lub nazwa domeny do zapytania
#-quiet - aby zwróciła tylko wartość Boolean
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
$PictureBox.imageLocation = "C:Testyes.png" #Obiekt wskazuje na odpowiedni obrazek
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Obiekt wskazuje na odpowiedni obrazek
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$main_form.Controls.Add($PictureBox)
Naši DNS-ji spet nagajajo...

In dodali bomo še gumb, da bomo lahko osvežili prikazane podatke.

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(100,150)
$Button.Size = New-Object System.Drawing.Size(80,30)
$Button.Text = "Osveži"
# Na dogodek pritiska gumba priredimo vsak PictureBox v skladu s prej opisano logiko
$Button.Add_Click({
if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True)
{$PictureBox.imageLocation = "C:Testyes.png"}
Else {$PictureBox.imageLocation = "C:Testno.png"}
if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True)
{$PictureBox1.imageLocation = "C:Testyes.png"}
Else {$PictureBox1.imageLocation = "C:Testno.png"}
})
$main_form.Controls.Add($Button)

Odlično, zdaj v produkcijo!?
Ko sem ročno vnesel približno pol ducat hostov, sem nenadoma spoznal eno stvar — ta projekt se bo končal, hosti se bodo spremenili in vsakič bom moral popravljati skript. Po eni strani ni nič hudega, to je rešitev za mene. Po drugi strani pa si oglejte, kaj se dogaja:
Prizor ni za šibke živce
Add-Type -assembly System.Windows.Forms #Naložimo knjižnico
$main_form = New-Object System.Windows.Forms.Form #Ustvarimo spremenljivko z našim "oknom"
#Določimo mu parametre preko parametrov
$main_form.Text ='Links up' #Ime v naslovni vrstici
$main_form.Width = 300 #Širina okna
$main_form.Height = 200 #Višina okna
$main_form.AutoSize = $true #Damo mu možnost samostojnega spreminjanja velikosti, če je potrebno
$Label = New-Object System.Windows.Forms.Label #Vse elemente obrazca bomo shranili v spremenljivke, vendar so v bistvu to objekti, kot katere koli druge spremenljivke v Powershell
$Label.Text = "ya.ru ............................" #Izpisano besedilo
$Label.Location = New-Object System.Drawing.Point(15,10) #Položaj objekta znotraj obrazca po vodoravni in navpični osi (x,y)
$Label.AutoSize = $true
$Label1 = New-Object System.Windows.Forms.Label #Vse elemente obrazca bomo shranili v spremenljivke, vendar so v bistvu to objekti, kot katere koli druge spremenljivke v Powershell
$Label1.Text = "8.8.8.8 ............................" #Izpisano besedilo googl-ovskega DNS
$Label1.Location = New-Object System.Drawing.Point(15,30) #Položaj objekta znotraj obrazca po vodoravni in navpični osi (x,y)
$Label1.AutoSize = $true
$Label2 = New-Object System.Windows.Forms.Label
$Label2.Text = "192.168.x.x ............................"
$Label2.Location = New-Object System.Drawing.Point(15,50)
$Label2.AutoSize = $true
$Label3 = New-Object System.Windows.Forms.Label
$Label3.Text = "192.168.x.x ............................"
$Label3.Location = New-Object System.Drawing.Point(15,70)
$Label3.AutoSize = $true
$Label4 = New-Object System.Windows.Forms.Label
$Label4.Text = "10.0.x.x ............................"
$Label4.Location = New-Object System.Drawing.Point(15,90)
$Label4.AutoSize = $true
$Label5 = New-Object System.Windows.Forms.Label
$Label5.Text = "162.102.x.x ............................"
$Label5.Location = New-Object System.Drawing.Point(15,110)
$Label5.AutoSize = $true
$PictureBox = New-Object system.Windows.Forms.PictureBox #Objekt za izpisovanje slik se imenuje povsem logično
$PictureBox.width = 10
$PictureBox.height = 10
#Tukaj preidemo k bistvu, povežemo izpisano sliko z rezultatom preverjanja dostopnosti vozlišča, s pomočjo ukaza
#<b>test-connection</b>, kjer:
#-Count - prenaša število zahtevkov
#-computer - IP ali domena za zahtevo
#-quiet - da nam vrne zgolj Boolean vrednost
$PictureBox.location = New-Object System.Drawing.Point(235,12)
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
$PictureBox.imageLocation = "C:Testyes.png" #Objekt se sklicuje na ustrezno sliko
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Objekt se sklicuje na ustrezno sliko
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox1 = New-Object system.Windows.Forms.PictureBox #Objekt za prikaz slik se imenuje povsem smiselno
$PictureBox1.width = 10
$PictureBox1.height = 10
$PictureBox1.location = New-Object System.Drawing.Point(235,32)
if ((test-connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True) {
$PictureBox1.imageLocation = "C:Testyes.png" #Objekt se sklicuje na ustrezno sliko
}
Else {
$PictureBox1.imageLocation = "C:Testno.png" #Objekt se sklicuje na ustrezno sliko
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox2 = New-Object system.Windows.Forms.PictureBox #Objekt za prikaz slik se imenuje povsem smiselno
$PictureBox2.width = 10
$PictureBox2.height = 10
$PictureBox2.location = New-Object System.Drawing.Point(235,52)
if ((test-connection -Count 1 -computer 192.168.x.x -quiet) -eq $True) {
$PictureBox2.imageLocation = "C:Testyes.png" #Objekt se sklicuje na ustrezno sliko
}
Else {
$PictureBox2.imageLocation = "C:Testno.png" #Objekt se sklicuje na ustrezno sliko
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox3 = New-Object system.Windows.Forms.PictureBox #Objekt za prikaz slik se imenuje povsem smiselno
$PictureBox3.width = 10
$PictureBox3.height = 10
$PictureBox3.location = New-Object System.Drawing.Point(235,72)
if ((test-connection -Count 1 -computer 192.168.x.x -quiet) -eq $True) {
$PictureBox3.imageLocation = "C:Testyes.png" #Objekt se sklicuje na ustrezno sliko
}
Else {
$PictureBox3.imageLocation = "C:Testno.png" #Objekt se sklicuje na ustrezno sliko
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox4 = New-Object system.Windows.Forms.PictureBox #Objekt za prikaz slik se imenuje povsem smiselno
$PictureBox4.width = 10
$PictureBox4.height = 10
$PictureBox4.location = New-Object System.Drawing.Point(235,92)
if ((test-connection -Count 1 -computer 10.0.x.x -quiet) -eq $True) {
$PictureBox4.imageLocation = "C:Testyes.png" #Objekt se sklicuje na ustrezno sliko
}
Else {
$PictureBox4.imageLocation = "C:Testno.png" #Objekt se sklicuje na ustrezno sliko
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox5 = New-Object system.Windows.Forms.PictureBox #Objekt za prikaz slik se imenuje povsem smiselno
$PictureBox5.width = 10
$PictureBox5.height = 10
$PictureBox5.location = New-Object System.Drawing.Point(235,112)
if ((test-connection -Count 1 -computer 162.102.x.x -quiet) -eq $True) {
$PictureBox5.imageLocation = "C:Testyes.png" #Objekt se sklicuje na ustrezno sliko
}
Else {
$PictureBox5.imageLocation = "C:Testno.png" #Objekt se sklicuje na ustrezno sliko
}
$PictureBox5.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(100,150)
$Button.Size = New-Object System.Drawing.Size(80,30)
$Button.Text = "Osveži"
# Dodelimo dogodek za klik gumba vsakemu PictureBoxu v skladu s prej opisano logiko
$Button.Add_Click({
if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True)
{$PictureBox.imageLocation = "C:Testyes.png"}
Else {$PictureBox.imageLocation = "C:Testno.png"}
if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True)
{$PictureBox1.imageLocation = "C:Testyes.png"}
Else {$PictureBox1.imageLocation = "C:Testno.png"}
if ((Test-Connection -Count 1 -computer 192.168.x.x -quiet) -eq $True)
{$PictureBox2.imageLocation = "C:Testyes.png"}
Else {$PictureBox2.imageLocation = "C:Testno.png"}
if ((Test-Connection -Count 1 -computer 192.168.x.x -quiet) -eq $True)
{$PictureBox3.imageLocation = "C:Testyes.png"}
Else {$PictureBox3.imageLocation = "C:Testno.png"}
if ((Test-Connection -Count 1 -computer 10.0.x.x -quiet) -eq $True)
{$PictureBox4.imageLocation = "C:Testyes.png"}
Else {$PictureBox4.imageLocation = "C:Testno.png"}
if ((Test-Connection -Count 1 -computer 162.102.x.x -quiet) -eq $True)
{$PictureBox5.imageLocation = "C:Testyes.png"}
Else {$PictureBox5.imageLocation = "C:Testno.png"}
})
$main_form.Controls.Add($Label) #dodamo ustvarjeni objekt k obliki, da se ne izgubi med izvajanjem skripta
$main_form.Controls.Add($Label1)
$main_form.Controls.Add($Label2)
$main_form.Controls.Add($Label3)
$main_form.Controls.Add($Label4)
$main_form.Controls.Add($Label5)
$main_form.Controls.Add($PictureBox)
$main_form.Controls.Add($PictureBox1)
$main_form.Controls.Add($PictureBox2)
$main_form.Controls.Add($PictureBox3)
$main_form.Controls.Add($PictureBox4)
$main_form.Controls.Add($PictureBox5)
$main_form.Controls.Add($Button)
$main_form.ShowDialog() #Prikažemo osnovno in preprosto okno
Tudi če upoštevamo čistočo in sledimo strukturi, bo občasno urejanje povzročilo neprijetne občutke.
Najpre iznajmiti proveru dostupnosti u posebnu funkciju, a put do direktorija u posebnu promenljivu:
$script_path = "C:TestPS ping"
#Prelazimo u funkciju sa već formiranim objektom PictureBox i IP adresom koja treba da se proveri.
#Na izlazu menja učitanu sliku.
function get_status($PictureBox,$path_ip) {
if ((Test-Connection -Count 1 -computer $path_ip -quiet) -eq $True)
{$PictureBox.imageLocation = $script_path + "yes.png"}
Else {$PictureBox.imageLocation = $script_path + "no.png"}
}
Izdvojimo podatke o hostu u spoljašnju datoteku path.txt, upisujući ih u obliku «ip/host-funkcionalno-ime/», a u dokumentu ćemo ih primati u nizove. Takođe ćemo učiniti izračunavanje Y pozicije automatizovanijim. Sve ovo nam omogućava da kreiramo Label-e i checkbox-e pozivom funkcije:

#создаем описательную линию, на вход идут: объект Label, IP-адресс, описание и позиция по оси Y
Function Create_line($label,$path_ip,$caption, $top){
$label.Location = New-Object System.Drawing.Point(1, $top)
$label.text = $path_ip+$caption
$label.font = $font
$Label.AutoSize = $true
}
#создаем индикатор для описательной линию, на вход идут: объект PictureBox, IP-адресс и позиция по оси Y
Function Create_link($PictureBox,$path_ip, $top){
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(210,$top)
get_status -PictureBox $PictureBox -path_ip $path_ip
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
}
$line = Get-content -LiteralPath $script_path"path.txt" #вытаскиваем данные о необходимых хостах
$len = $line.Length #вычисляем длину, а точнее массив длин каждой строки
$i = 0
#далее объявляем массивы которые понадобятся дальше
$ip = @() #массив ip
$capt = @() #массив описания
$Labels =@() #массив Label
$PictureBoxs =@() #массив PictureBox
while($i -lt $len){
$f = $line[$i].IndexOf("/") #вычисляем позицию начала описания
$l = $line[$i].LastIndexOf("/") #вычисляем позицию конца описания
$ip += $line[$i].Substring(0,$f) #вытаскиваем ip
$capt += $line[$i].Substring($f+1,$l-$f-1) #вытаскиваем описание
#создаем поле Label
Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
#создаем поле PictureBox
Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top
$label_from_top += 15 #делаем "шаг" по оси Y
$Labels += $label_obj #вносим созданный Label в общий массив
$PictureBoxs += $PictureBox_obj #вносим созданный PictureBox в общий массив
$main_form.Controls.Add($Labels[$i])
$main_form.Controls.Add($PictureBoxs[$i])
$i +=1
}
Dodajmo mesto za prikaz vremena poslednje provere, jer je to zgodno, i malo ćemo dopuniti radnju prilikom pritiska na dugme.

$Label0 = New-Object System.Windows.Forms.Label
$Label0.Text = Get-Date
$Label0.Location = New-Object System.Drawing.Point(80,180)
$Label0.AutoSize = $true
$main_form.Controls.Add($Label0)
$Button.Add_Click({
while($i -lt $len){
get_status -PictureBox $PictureBoxs[$i] -path_ip $ip[$i]
$i +=1
}
$Label0.Text = Get-Date
})
Takođe sam priključio malu funkcionalnost koja, kada otkrije nedostupan host, ne samo da menja indikator, već i vapi iz zvučnika.
Add-Type -AssemblyName System.Speech
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate = 5
$voice.Speak("Upozorenje! Upozorenje! Server je pod napadom!")
Tako da, nakon nekoliko ukrašavanja i dovođenja u čitljiv i prijatan oblik, to je ispalo ovako:
Puni kod skripte
Add-Type -AssemblyName System.Speech
Add-Type -assembly System.Windows.Forms
$script_path = "C:PS ping"
$label_from_top = 10
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate = 5
#Prelazi u funkciju već stvoreni objekt PictureBox i IP adresu koju treba proveriti.
#Na izlazu menja učitanu sliku.
function get_status($PictureBox,$path_ip) {
if ((Test-Connection -Count 1 -computer $path_ip -quiet) -eq $True) {
$PictureBox.imageLocation = $script_path + "yes.png"
}
Else {
$PictureBox.imageLocation = $script_path + "no.png"
$voice.Speak("Greška! Host " + $path_ip + ", nedostupan!")
}
}
#kreiramo opisnu liniju, ulaze: objekt Label, IP adresa, opis i pozicija po Y osi
Function Create_line($label,$path_ip,$caption, $top){
$label.Location = New-Object System.Drawing.Point(1, $top)
$label.text = $path_ip+$caption
$label.font = $font
$Label.AutoSize = $true
}
#kreiramo indikator za opisnu liniju, ulaze: objekt PictureBox, IP adresa i pozicija po Y osi
Function Create_link($PictureBox,$path_ip, $top){
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(210,$top)
get_status -PictureBox $PictureBox -path_ip $path_ip
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
}
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='Linkovi aktivni' #Ime u naslovu
$main_form.Width = 300 #Širina prozora
$main_form.Height = 200 #Visina prozora
$main_form.AutoSize = $true #Dajemo mu mogućnost da se samostalno menja po veličini, kada je potrebno
$main_form.TopMost = $true #Ovo je vrlo važno, omogućava da se prozor drži iznad drugih
$line = Get-content -LiteralPath $script_path"path.txt" #izvlačimo podatke o potrebnim hostovima
$len = $line.Length #izračunavamo dužinu, tačnije niz dužina svake linije
$i = 0
#dalje objavljujemo nizove koji će biti potrebni kasnije
$ip = @() #niz ip
$capt = @() #niz opisa
$Labels =@() #niz Label
$PictureBoxs =@() #niz PictureBox
while($i -lt $len){
$f = $line[$i].IndexOf("/") #izračunavamo poziciju početka opisa
$l = $line[$i].LastIndexOf("/") #izračunavamo poziciju kraja opisa
$ip += $line[$i].Substring(0,$f) #izvučemo ip
$capt += $line[$i].Substring($f+1,$l-$f-1) #izvučemo opis
#kreiramo polje Label
Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
#kreiramo polje PictureBox
Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top
$label_from_top += 15 #pravimo "korak" po Y osi
$Labels += $label_obj #dodajemo kreirani Label u zajednički niz
$PictureBoxs += $PictureBox_obj #dodajemo kreirani PictureBox u zajednički niz
$main_form.Controls.Add($Labels[$i])
$main_form.Controls.Add($PictureBoxs[$i])
$i +=1
}
#ovo polje sa poslednjim vremenom provere
$Label0 = New-Object System.Windows.Forms.Label
$Label0.Text = Get-Date
$Label0.Location = New-Object System.Drawing.Point(80,180)
$Label0.AutoSize = $true
# Postavljamo događaj na pritisak dugmeta za svaki PictureBox prema prethodno opisanoj logici
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(100,200)
$Button.Size = New-Object System.Drawing.Size(80,30)
$Button.Text = "Ponovno učitaj"
$Button.Add_Click({
while($i -lt $len){
get_status -PictureBox $PictureBoxs[$i] -path_ip $ip[$i]
$i +=1
}
$i = 0
$Label0.Text = Get-Date
})
$main_form.Controls.Add($Button)
$main_form.Controls.Add($Label0)
$main_form.ShowDialog()
Zadnja misel
Upam, da bo ta vodič nekomu v pomoč. Če ste to počeli že od malih nog, vas čestitam, jaz pa tega nisem. Sem pa odprt za vaše komentarje in predloge.
Zame je bilo prijetno raziskovati in sestaviti to preprosto, a uporabno orodje. Načrtujem še implementacijo dodajanja in brisanja vozlišč preko GUI ter tudi, da naredim tisto, kar bi moralo biti na začetku izvedeno, samodejno posodabljanje statusov brez potrebe po nenehnem pritiskanju na gumb in da ne zruši "powershell.exe".
