Mindenkinek jó napot kívánok, szeretném megosztani egy egyszerű útmutatót „Hogyan lehet abbahagyni a tucatnyi hoszt manuális pingelését. Regisztráció és SMS nélkül!”.
Az Internet világából
Fontos: nem vagyok programozó, és nem rendszergazda, de egyszerre sok szolgáltatással kell dolgoznom szerverek és ezt a scriptet saját kényelmem érdekében írtam.
Mindenkit, akit ez érdekelhet, szeretettel várok.
Miért PowershellVan tapasztalatom egyszerű programok írásában Pythonban, de ez vagy telepített interpretert igényel, vagy jogot a .exe fájlok futtatásához, ami a munkám keretein belül nem mindig lehetséges. Viszont a Powershell scriptet gyakran sikerül futtatni.
Nem mindenki szereti a konzolt/terminált
Szerintem ebben nincs ellentmondás, különben mindenki konzolos levelezőklienseket használna, és a *nix rendszerekben nem jelent volna meg GUI.
Mivel a mindennapi életben elég primitíven használom a Powershell-t, először megpróbáltam megérteni, hogy lehet-e hozzá GUI-t csatolni. Kiderült, hogy lehet, sőt, elég egyszerűen:

Add-Type -assembly System.Windows.Forms # Könyvtár csatlakoztatása
$main_form = New-Object System.Windows.Forms.Form # Létrehozunk egy objektumot a "ablakunk"-kal
# Beállítjuk a paramétereit
$main_form.Text ='Linkek aktívak' # Cím a fejlécben
$main_form.Width = 300 # Ablak szélessége
$main_form.Height = 200 # Ablak magassága
$main_form.AutoSize = $true # Lehetőséget adunk neki, hogy szükség szerint magától változtassa a méretét
$main_form.ShowDialog() # Meghívjuk az "ablakot"
Ehez adjuk a kimeneti elemet, és kapunk egy elemi Windows-ablakot, tautológia?.

Add-Type -assembly System.Windows.Forms #Könyvtár csatlakoztatása
$main_form = New-Object System.Windows.Forms.Form #A "bemásolás" ablakunk változójának létrehozása
#Paraméterek megadása
$main_form.Text ='Links up' #Cím a fejlécben
$main_form.Width = 300 #Ablak szélessége
$main_form.Height = 200 #Ablak magassága
$main_form.AutoSize = $true #Automatikus méretváltoztatási lehetőség, ha szükséges
$Label = New-Object System.Windows.Forms.Label #Minden űrlap elem változókba lesz tárolva, de valójában ezek objektumok, mint bármely más Powershell változó
$Label.Text = "Helló! Én egy alap Windows-ablak vagyok, te mit értél el?" #Megjelenítendő szöveg
$Label.Location = New-Object System.Drawing.Point(10,65) #A objektum elhelyezkedése az űrlapon vízszintesen és függőlegesen (x,y)
$Label.AutoSize = $true
$main_form.Controls.Add($Label) #Kiegészítjük az újonnan létrehozott objektumot az űrlaphoz, hogy ne vesszen el a script futása közben
$main_form.ShowDialog() #Elindítjuk az egységes ablakotAdjunk hozzá dinamizmust
Ez az eszköz, amellyel a "Yandexet pingeltem" és *.iso fájlokat csatoltam, most külön GUI-t kapott, de ez még mindig kevés. Hasonló módon információt kaphatunk a hozzáférhetőségről, de a monitorozáshoz minden alkalommal újra kell indítanunk a scriptet.
Kezdésnek rajzoljunk két ikont, és adjunk lehetőséget képek megjelenítésére.

$PictureBox = New-Object system.Windows.Forms.PictureBox #A képek megjelenítésére szolgáló objektum logikus néven hívják
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)
#Itt jön a lényeg, összekötjük a megjelenítendő képet a csatlakozási ellenőrzés eredményével, használva a parancsmintát
#<b>test-connection</b>, ahol:
#-Count - a kérések számát adja át
#-computer - az IP cím vagy domain név a kéréshez
#-quiet - hogy csak Boolean értéket kapjunk vissza
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
$PictureBox.imageLocation = "C:Testyes.png" #Az objektum hivatkozik a megfelelő képre
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Az objektum hivatkozik a megfelelő képre
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$main_form.Controls.Add($PictureBox)
Ismét zavarják a DNS bejegyzéseink…

És még adjunk hozzá egy gombot, hogy legyen lehetőség az adatok frissítésére.

$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 = "Újratöltés"
# Minden PictureBox eseményére hozzárendeljük a gomb megnyomásakor a korábban leírt logikának megfelelően
$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)

Csodálatos, most már a gyártásba!?
Kézzel körülbelül fél tucat hostot megadva rájöttem valamire – ennek a projektnek véget kell érnie, a hostok változnak, és minden alkalommal módosítanom kell a scriptet. Egyrészt nem nagy ügy, ez nekem készült. Másrészt nézzük meg, mi is történik:
Látvány nem a gyengéknek
Add-Type -assembly System.Windows.Forms #Csatlakoztatjuk a könyvtárat
$main_form = New-Object System.Windows.Forms.Form #Létrehozunk egy változót a "window"-hoz
#Beállítjuk az ablak paramétereit
$main_form.Text ='Links up' #Cím a fejlécben
$main_form.Width = 300 #Ablak szélessége
$main_form.Height = 200 #Ablak magassága
$main_form.AutoSize = $true #Lehetővé tesszük, hogy szükség esetén automatikusan állítsa be a méretét
$Label = New-Object System.Windows.Forms.Label #Minden elem az űrlapon változókba kerül, de ezek valójában objektumok, mint bármely más változó a Powershell-ben
$Label.Text = "ya.ru ............................" #Kimeneti szöveg
$Label.Location = New-Object System.Drawing.Point(15,10) #A címke elhelyezkedése az űrlapon vízszintesen és függőlegesen (x,y)
$Label.AutoSize = $true
$Label1 = New-Object System.Windows.Forms.Label #Minden elem az űrlapon változókba kerül, de ezek valójában objektumok, mint bármely más változó a Powershell-ben
$Label1.Text = "8.8.8.8 ............................" #Kimeneti szöveg a Google DNS szerveréről
$Label1.Location = New-Object System.Drawing.Point(15,30) #A címke elhelyezkedése az űrlapon vízszintesen és függőlegesen (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 #A kép megjelenítésére szolgáló objektum, amely meglehetősen logikus nevet kapott
$PictureBox.width = 10
$PictureBox.height = 10
#Itt áttérünk a lényegre, összekötjük a megjelenítendő képet a csomópont elérhetőségének ellenőrzési eredményével
#<b>test-connection</b>, ahol:
#-Count - az küldött kérések számát adja meg
#-computer - a kéréshez szükséges IP vagy domain név
#-quiet - hogy csak Boolean értéket kapjunk vissza
$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" #Az objektum a megfelelő képre mutat
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Az objektum a megfelelő képre mutat
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox1 = New-Object system.Windows.Forms.PictureBox #Az objektum neve eléggé logikus a képek megjelenítéséhez
$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" #Az objektum a megfelelő képre mutat
}
Else {
$PictureBox1.imageLocation = "C:Testno.png" #Az objektum a megfelelő képre mutat
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox2 = New-Object system.Windows.Forms.PictureBox #Az objektum neve eléggé logikus a képek megjelenítéséhez
$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" #Az objektum a megfelelő képre mutat
}
Else {
$PictureBox2.imageLocation = "C:Testno.png" #Az objektum a megfelelő képre mutat
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox3 = New-Object system.Windows.Forms.PictureBox #Az objektum neve eléggé logikus a képek megjelenítéséhez
$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" #Az objektum a megfelelő képre mutat
}
Else {
$PictureBox3.imageLocation = "C:Testno.png" #Az objektum a megfelelő képre mutat
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox4 = New-Object system.Windows.Forms.PictureBox #Az objektum neve eléggé logikus a képek megjelenítéséhez
$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" #Az objektum a megfelelő képre mutat
}
Else {
$PictureBox4.imageLocation = "C:Testno.png" #Az objektum a megfelelő képre mutat
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox5 = New-Object system.Windows.Forms.PictureBox #Az objektum neve eléggé logikus a képek megjelenítéséhez
$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" #Az objektum a megfelelő képre mutat
}
Else {
$PictureBox5.imageLocation = "C:Testno.png" #Az objektum a megfelelő képre mutat
}
$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 = "Újratöltés"
# Az eseményhez rendeljük hozzá a gombnyomáskor minden PictureBox elérhetőségét a korábban leírt logika szerint
$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) #hozzáadjuk a létrehozott objektumot a formhoz, hogy ne vesszen el a szkript végrehajtása során
$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() #Elindítjuk az alapértelmezett ablakot
Még ha meg is tartjuk a tisztaságot, és követjük a struktúrát, a periódikus szerkesztések nem éppen kellemes érzéseket fognak okozni.
Először külön funkcióba emeljük a hozzáférhetőség ellenőrzését, a könyvtár elérési útját pedig külön változóba helyezzük:
$script_path = "C:TestPS ping"
#Áthelyezzük a funkcióba a már létrehozott PictureBox objektumot és az IP-címet, amelyet ellenőrizni kell.
#A kimenet megváltoztatja a betöltött képet.
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"}
}
A hosztra vonatkozó adatokat egy külső path.txt fájlba helyezzük, a következő formátumban: „ip/hostname-funkció/”, és a dokumentumban tömbökben fogjuk azokat tárolni. A Y pozíció kiszámítása is automatizáltabbá válik. Mindez lehetővé teszi számunkra, hogy funkcióhívásokkal hozzunk létre Label-eket és checkbox-okat:

#создаем описательную линию, на вход идут: объект 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
}
Hozzáadunk egy helyet az utolsó ellenőrzés idejének megjelenítésére, mert ez hasznos, és egy kicsit kiegészítjük a gomb lenyomásakor végrehajtott műveletet.

$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
})
Ezenkívül csatlakoztattam egy kis funkciót, amely, amikor elérhetetlen hosztot észlel, nemcsak a jelző megváltozásával, hanem a hangszórók zúgásával is figyelmeztet.
Add-Type -AssemblyName System.Speech
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate = 5
$voice.Speak("Figyelmeztetés! Figyelmeztetés! A rendszer támadás alatt áll!")
Tehát miután néhány díszítést és olvashatóságot igénylő módosítást végeztem, így alakult:
A szkript teljes kódja
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
# A megadott IP-cím státuszának ellenőrzése és a képek frissítése.
# A kimenet az előzőleg betöltött képet változtatja meg.
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("Hiba! A " + $path_ip + " hoszt nem elérhető!")
}
}
# Létrehozunk egy leíró sort, bemeneti paraméterek: Label objektum, IP-cím, leírás és Y koordináta
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
}
# Létrehozunk egy indikátort a leíró sorhoz, bemeneti paraméterek: PictureBox objektum, IP-cím és Y koordináta
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 ='Hidak állapota' #A cím a fejlécben
$main_form.Width = 300 #Az ablak szélessége
$main_form.Height = 200 #Az ablak magassága
$main_form.AutoSize = $true #Lehetővé tesszük, hogy magától változtassa a méretét
$main_form.TopMost = $true #Ez nagyon fontos, lehetővé teszi az ablak más ablakok fölé rögzítését
$line = Get-content -LiteralPath $script_path"path.txt" #Kiolvassuk a szükséges hosztok adatait
$len = $line.Length #Kiszámítjuk a hosszát, pontosabban minden sor hosszának tömbét
$i = 0
# Ezután tömböket deklarálunk, amelyek a jövőben szükségesek
$ip = @() #IP tömb
$capt = @() #leírás tömb
$Labels =@() #Label tömb
$PictureBoxs =@() #PictureBox tömb
while($i -lt $len){
$f = $line[$i].IndexOf("/") #Kiszámítjuk a leírás kezdetének helyét
$l = $line[$i].LastIndexOf("/") #Kiszámítjuk a leírás végét
$ip += $line[$i].Substring(0,$f) #Kiolvassuk az IP-t
$capt += $line[$i].Substring($f+1,$l-$f-1) #Kiolvassuk a leírást
# Létrehozunk egy Label mezőt
Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
# Létrehozunk egy PictureBox mezőt
Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top
$label_from_top += 15 # Létrehozzuk a lépést az Y tengelyen
$Labels += $label_obj # A létrehozott Label-t hozzáfűzzük a közös tömbhöz
$PictureBoxs += $PictureBox_obj # A létrehozott PictureBox-ot hozzáfűzzük a közös tömbhöz
$main_form.Controls.Add($Labels[$i])
$main_form.Controls.Add($PictureBoxs[$i])
$i +=1
}
# Ez a mező az utolsó ellenőrzési idővel
$Label0 = New-Object System.Windows.Forms.Label
$Label0.Text = Get-Date
$Label0.Location = New-Object System.Drawing.Point(80,180)
$Label0.AutoSize = $true
# Minden PictureBox-ra nyomógomb eseményt kötünk a korábban leírt logika szerint
$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 = "Újratöltés"
$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()
Utószó
Remélem, valakinek hasznos lesz ez a tutorial. Ha pedig te ezt szinte gyerekként csináltad, akkor gratulálok, én nem csináltam. De szívesen hallgatom a megjegyzéseidet és javaslataidat.
Nekem magamnak is örömet okozott, hogy kicsit turkáljak és összeszedjek egy ilyen kicsi, de a mindennapi életben hasznos eszközt. Terveim között szerepel még a GUI-ból való csomópontok hozzáadása és törlése, valamint a státuszok automatikus frissítése, anélkül hogy "nyomkodni" kellene a gombot, és hogy a "powershell.exe"-t ne akassza meg.
A script legújabb verziója itt található GitHub
Forrás: habr.com
