Powershell Host-Verfügbarkeitsüberwachung

Guten Tag, ich möchte eine einfache Anweisung weitergeben: "Wie kann ich aufhören, ein Dutzend Hosts manuell zu pingen? Ohne Registrierung und SMS! “

Aus dem Internet

Wichtig : Ich bin kein Programmierer oder Systemadministrator, muss aber gleichzeitig mit einer großen Anzahl von Servern und Diensten arbeiten und habe dieses Skript zu meiner eigenen Bequemlichkeit geschrieben.

An alle, die dies nützlich und neugierig finden mögen, frage ich unter Katze.


Warum Powershell
Ich habe Erfahrung mit dem Schreiben einfacher Python-Programme, aber es erfordert entweder einen installierten Interpreter oder das Recht, .exe auszuführen, was im Rahmen meiner Arbeit nicht immer möglich ist. Das Powershell-Skript kann jedoch häufig ausgeführt werden.

Nicht jeder liebt die Konsole / das Terminal


Ich denke, dies ist kein Widerspruch, sonst würden immer noch alle Konsolen-Mail-Clients verwenden und die GUI würde nicht in * nix-Systemen erscheinen.

Da ich im Alltag Powershell eher primitiv einsetzen muss, habe ich zunächst versucht zu verstehen, ob es möglich ist, die GUI daran zu befestigen. Es stellt sich heraus, dass Sie können, und sogar ganz einfach:


Add-Type -assembly System.Windows.Forms #  $main_form = New-Object System.Windows.Forms.Form #    "" #    $main_form.Text ='Links up' #   $main_form.Width = 300 #  $main_form.Height = 200 #  $main_form.AutoSize = $true #     ,   $main_form.ShowDialog() # "" 

Fügen Sie diesem ein Ausgabeelement hinzu und erhalten Sie ein elementares Windwows- Tautologiefenster? .


 Add-Type -assembly System.Windows.Forms #  $main_form = New-Object System.Windows.Forms.Form #    "" #      $main_form.Text ='Links up' #   $main_form.Width = 300 #  $main_form.Height = 200 #  $main_form.AutoSize = $true #     ,   $Label = New-Object System.Windows.Forms.Label #      ,     ,      Powershell $Label.Text = "!   Windows-,    ?" #  $Label.Location = New-Object System.Drawing.Point(10,65) #        (x,y) $Label.AutoSize = $true $main_form.Controls.Add($Label) #    ,        $main_form.ShowDialog() #    

Lautsprecher hinzufügen


Das Tool, mit dem ich Yandex "gepingt" und * .iso gemountet habe, hat also eine separate GUI, aber das reicht nicht aus. Ebenso können Sie Informationen zur Barrierefreiheit anzeigen, aber zur Überwachung müssen Sie das Skript jedes Mal neu starten.

Zeichnen Sie zunächst zwei Symbole und fügen Sie die Möglichkeit hinzu, Bilder anzuzeigen.


 $PictureBox = New-Object system.Windows.Forms.PictureBox #       $PictureBox.width = 10 $PictureBox.height = 10 $PictureBox.location = New-Object System.Drawing.Point(178,12) #                #<b>test-connection</b>, : #-Count -  -  #-computer - IP      #-quiet -       Boolean  if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) { $PictureBox.imageLocation = "C:\Test\yes.png" #     } Else { $PictureBox.imageLocation = "C:\Test\no.png" #     } $PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $main_form.Controls.Add($PictureBox) 

Wieder sind unsere DNS-Spitznamen ungezogen ...


Fügen Sie eine Schaltfläche hinzu, damit Sie die Messwerte aktualisieren können.


 $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 = "Reload" #        PictureBox     $Button.Add_Click({ if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True) {$PictureBox.imageLocation = "C:\Test\yes.png"} Else {$PictureBox.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True) {$PictureBox1.imageLocation = "C:\Test\yes.png"} Else {$PictureBox1.imageLocation = "C:\Test\no.png"} }) $main_form.Controls.Add($Button) 


Großartig, jetzt in Produktion! ?


Nachdem ich ungefähr ein halbes Dutzend Hosts manuell verschrieben hatte, wurde mir plötzlich eines klar - aber dieses Projekt wird enden, die Hosts werden sich ändern und ich muss das Skript jedes Mal bearbeiten. Einerseits ist es okay, es ist die gleiche Entscheidung für Sie. Auf der anderen Seite ist dies eine Entscheidung für sich selbst, Geliebte. Schauen Sie sich an, was passiert:

Das Spektakel ist nichts für schwache Nerven
 Add-Type -assembly System.Windows.Forms #  $main_form = New-Object System.Windows.Forms.Form #    "" #      $main_form.Text ='Links up' #   $main_form.Width = 300 #  $main_form.Height = 200 #  $main_form.AutoSize = $true #     ,   $Label = New-Object System.Windows.Forms.Label #      ,     ,      Powershell $Label.Text = "ya.ru ............................" #  $Label.Location = New-Object System.Drawing.Point(15,10) #        (x,y) $Label.AutoSize = $true $Label1 = New-Object System.Windows.Forms.Label #      ,     ,      Powershell $Label1.Text = "8.8.8.8 ............................" #  googl- DNS- $Label1.Location = New-Object System.Drawing.Point(15,30) #        (x,y) $Label1.AutoSize = $true $Label2 = New-Object System.Windows.Forms.Label $Label2.Text = "192.168.xx ............................" $Label2.Location = New-Object System.Drawing.Point(15,50) $Label2.AutoSize = $true $Label3 = New-Object System.Windows.Forms.Label $Label3.Text = "192.168.xx ............................" $Label3.Location = New-Object System.Drawing.Point(15,70) $Label3.AutoSize = $true $Label4 = New-Object System.Windows.Forms.Label $Label4.Text = "10.0.xx ............................" $Label4.Location = New-Object System.Drawing.Point(15,90) $Label4.AutoSize = $true $Label5 = New-Object System.Windows.Forms.Label $Label5.Text = "162.102.xx ............................" $Label5.Location = New-Object System.Drawing.Point(15,110) $Label5.AutoSize = $true $PictureBox = New-Object system.Windows.Forms.PictureBox #       $PictureBox.width = 10 $PictureBox.height = 10 #                #<b>test-connection</b>, : #-Count -  -  #-computer - IP      #-quiet -       Boolean  $PictureBox.location = New-Object System.Drawing.Point(235,12) if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) { $PictureBox.imageLocation = "C:\Test\yes.png" #     } Else { $PictureBox.imageLocation = "C:\Test\no.png" #     } $PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox1 = New-Object system.Windows.Forms.PictureBox #       $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:\Test\yes.png" #     } Else { $PictureBox1.imageLocation = "C:\Test\no.png" #     } $PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox2 = New-Object system.Windows.Forms.PictureBox #       $PictureBox2.width = 10 $PictureBox2.height = 10 $PictureBox2.location = New-Object System.Drawing.Point(235,52) if ((test-connection -Count 1 -computer 192.168.xx -quiet) -eq $True) { $PictureBox2.imageLocation = "C:\Test\yes.png" #     } Else { $PictureBox2.imageLocation = "C:\Test\no.png" #     } $PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox3 = New-Object system.Windows.Forms.PictureBox #       $PictureBox3.width = 10 $PictureBox3.height = 10 $PictureBox3.location = New-Object System.Drawing.Point(235,72) if ((test-connection -Count 1 -computer 192.168.xx -quiet) -eq $True) { $PictureBox3.imageLocation = "C:\Test\yes.png" #     } Else { $PictureBox3.imageLocation = "C:\Test\no.png" #     } $PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox4 = New-Object system.Windows.Forms.PictureBox #       $PictureBox4.width = 10 $PictureBox4.height = 10 $PictureBox4.location = New-Object System.Drawing.Point(235,92) if ((test-connection -Count 1 -computer 10.0.xx -quiet) -eq $True) { $PictureBox4.imageLocation = "C:\Test\yes.png" #     } Else { $PictureBox4.imageLocation = "C:\Test\no.png" #     } $PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox5 = New-Object system.Windows.Forms.PictureBox #       $PictureBox5.width = 10 $PictureBox5.height = 10 $PictureBox5.location = New-Object System.Drawing.Point(235,112) if ((test-connection -Count 1 -computer 162.102.xx -quiet) -eq $True) { $PictureBox5.imageLocation = "C:\Test\yes.png" #     } Else { $PictureBox5.imageLocation = "C:\Test\no.png" #     } $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 = "Reload" #        PictureBox     $Button.Add_Click({ if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True) {$PictureBox.imageLocation = "C:\Test\yes.png"} Else {$PictureBox.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True) {$PictureBox1.imageLocation = "C:\Test\yes.png"} Else {$PictureBox1.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 192.168.xx -quiet) -eq $True) {$PictureBox2.imageLocation = "C:\Test\yes.png"} Else {$PictureBox2.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 192.168.xx -quiet) -eq $True) {$PictureBox3.imageLocation = "C:\Test\yes.png"} Else {$PictureBox3.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 10.0.xx -quiet) -eq $True) {$PictureBox4.imageLocation = "C:\Test\yes.png"} Else {$PictureBox4.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 162.102.xx -quiet) -eq $True) {$PictureBox5.imageLocation = "C:\Test\yes.png"} Else {$PictureBox5.imageLocation = "C:\Test\no.png"} }) $main_form.Controls.Add($Label) #    ,        $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() #    

Selbst wenn Sie auf Sauberkeit achten und sich an die Struktur halten, führt die regelmäßige Bearbeitung nicht zu den angenehmsten Empfindungen.

Zunächst führen wir die Verfügbarkeitsprüfung in einer separaten Funktion und den Verzeichnispfad in einer separaten Variablen durch:

 $script_path = "C:\Test\PS ping" #      PictureBox  IP-   . #     . 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"} } 

Wir werden die Hostdaten in eine externe Datei path.txt übertragen und in Form von "ip / host-function-name /" schreiben. In dem Dokument werden wir sie in Arrays aufnehmen. Wir machen auch die Berechnung der Y-Position automatisierter. All dies gibt uns die Möglichkeit, Beschriftungen und Kontrollkästchen durch Aufrufen der Funktion zu erstellen:


 #  ,   :  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 } 

Wir werden einen Ort hinzufügen, an dem die Zeit der letzten Prüfung angezeigt wird, da dies praktisch ist, und wir werden beim Klicken auf die Schaltfläche leicht eine Aktion hinzufügen.


 $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 }) 

Und ich habe auch eine kleine Funktion angehängt, die kein Fehler ist. Als ein unzugänglicher Host erkannt wurde, meldete er nicht nur eine Änderung der Anzeige, sondern schrie auch aus den Lautsprechern.

 Add-Type -AssemblyName System.Speech $voice = New-Object System.Speech.Synthesis.SpeechSynthesizer $voice.Rate = 5 $voice.Speak("! !    !") 

Nach ein paar Verzierungen und einem für mich passenden, lesbaren Aussehen stellte sich Folgendes heraus:

Vollständiger Skriptcode
 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 #      PictureBox  IP-   . #     . 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("!  " + $path_ip + ", !") } } #  ,   :  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 } $main_form = New-Object System.Windows.Forms.Form $main_form.Text ='Links up' #   $main_form.Width = 300 #  $main_form.Height = 200 #  $main_form.AutoSize = $true #     ,   $main_form.TopMost = $true #   ,        $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 } #      $Label0 = New-Object System.Windows.Forms.Label $Label0.Text = Get-Date $Label0.Location = New-Object System.Drawing.Point(80,180) $Label0.AutoSize = $true #        PictureBox     $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 = "Reload" $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() 


Nachwort


Ich hoffe, jemand wird dieses Tutorial nützlich finden. Wenn Sie dies fast von der Wiege aus getan haben, dann herzlichen Glückwunsch, ich habe es nicht getan. Aber ich bin bereit, auf Ihre Kommentare und Vorschläge zu hören.

Für mich war es schön, einen so kleinen, aber nützlichen Nutzen im Alltag zu sammeln. Die Pläne müssen noch das Hinzufügen und Entfernen von Knoten aus der GUI implementieren sowie dasselbe tun, was in erster Linie automatische Statusaktualisierungen hätte implementieren sollen, ohne dass die Schaltfläche "gestoßen" werden muss und damit "Powershell.exe" nicht hängen bleibt.

Die neueste Version des Skripts auf GitHub

Source: https://habr.com/ru/post/de463777/


All Articles