Hostbeschikbaarheid monitoring met Powershell

Beste iedereen, ik wil een eenvoudige handleiding delen: "Hoe je kunt stoppen met handmatig pingen van een dozijn hosts. Zonder registratie en SMS!".

Hostbeschikbaarheid monitoring met PowershellUit de weidse wereld van het internet

Belangrijk: ik ben geen programmeur en geen systeembeheerder, maar ik moet werken met een groot aantal servers en diensten, en dit script heb ik geschreven voor mijn eigen gemak.

Iedereen die dit nuttig vindt, is welkom om verder te lezen.

Waarom PowershellIk heb ervaring met het schrijven van eenvoudige programma's in Python, maar dat vereist een geïnstalleerde interpreter of het recht om .exe-bestanden uit te voeren, wat in mijn werk niet altijd mogelijk is. Maar een script in Powershell kan meestal wel worden uitgevoerd.

Niet iedereen houdt van de console/terminal

Ik denk niet dat er een tegenstelling is; anders zou iedereen nog steeds console-e-mailcliënten gebruiken en zou er geen GUI zijn verschenen in *nix-systemen.

Aangezien ik Powershell in mijn dagelijkse routine vrij basaal gebruik, vroeg ik me af of het mogelijk is om een GUI eraan te koppelen. Blijkt dat het mogelijk is, en nog vrij eenvoudig ook:

Hostbeschikbaarheid monitoring met Powershell

Add-Type -assembly System.Windows.Forms #Verbind de bibliotheek
$main_form = New-Object System.Windows.Forms.Form #Maak een object met ons 'venster'

#Stel de parameters in
$main_form.Text ='Links up' #Naam in de titel
$main_form.Width = 300 #Breedte van het venster
$main_form.Height = 200 #Hoogte van het venster
$main_form.AutoSize = $true #Geef het de mogelijkheid om zichzelf te schalen, indien nodig
$main_form.ShowDialog() #Roep het 'venster' op

Voeg aan dit element een uitvoerelement toe en je krijgt een elementair Windows-venster - tautologie?

Hostbeschikbaarheid monitoring met Powershell

Add-Type -assembly System.Windows.Forms #We verbinden de bibliotheek

$main_form = New-Object System.Windows.Forms.Form #We creëren een variabele voor ons "venster"

#We stellen parameters in via parameters
$main_form.Text ='Links up' #Naam in de titel
$main_form.Width = 300 #Breedte van het venster
$main_form.Height = 200 #Hoogte van het venster
$main_form.AutoSize = $true #We geven het de mogelijkheid om zichzelf aan te passen indien nodig

$Label = New-Object System.Windows.Forms.Label #Alle elementen van het formulier worden in variabelen opgeslagen, maar in feite zijn dit objecten zoals andere variabelen in Powershell
$Label.Text = "Hallo! Ik ben een elementair Windows-venster, en wat heb jij bereikt?" #De weergegeven tekst
$Label.Location  = New-Object System.Drawing.Point(10,65) #De locatie van het object binnen het formulier in horizontale en verticale richting (x,y)
$Label.AutoSize = $true 

$main_form.Controls.Add($Label) #We voegen het gemaakte object toe aan het formulier, zodat het niet verloren gaat tijdens het uitvoeren van het script

$main_form.ShowDialog() #We roepen het elementaire venster aan

Laten we wat dynamiek toevoegen

De tool waarmee ik ‘Yandex pinge’ en *.iso monteer, heeft nu een aparte GUI, maar dat is niet genoeg. Op dezelfde manier kan informatie over de beschikbaarheid worden weergegeven, maar voor monitoring moet het script telkens opnieuw worden gestart.

Laten we eerst twee pictogrammen tekenen en de mogelijkheid toevoegen om afbeeldingen weer te geven.

Hostbeschikbaarheid monitoring met Powershell

$PictureBox = New-Object system.Windows.Forms.PictureBox #Object voor het weergeven van afbeeldingen is vrij logisch genoemd
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)

#Hier gaan we aan de slag met het koppelen van de te tonen afbeelding aan het resultaat van de beschikbaarheidstest van de host met behulp van de cmdlet
#<b>test-connection</b>, waar:
#-Count - geeft het aantal verzoeken door
#-computer - IP of domeinnaam voor het verzoek
#-quiet - zodat we alleen een Boolean waarde terugkrijgen
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
	$PictureBox.imageLocation = "C:Testyes.png" #Object verwijst naar de overeenkomstige afbeelding
}
Else {
	$PictureBox.imageLocation = "C:Testno.png" #Object verwijst naar de overeenkomstige afbeelding
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$main_form.Controls.Add($PictureBox)

Onze DNS-servers verstoren het weer...

Hostbeschikbaarheid monitoring met Powershell
En laten we ook een knop toevoegen zodat we de metingen kunnen vernieuwen.

Hostbeschikbaarheid monitoring met Powershell

$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 = "Herlaad"

# We koppelen het klikken op de knop aan elke PictureBox volgens de eerder beschreven logica
$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)

Hostbeschikbaarheid monitoring met Powershell

Geweldig, nu in productie!?

Door handmatig ongeveer een dozijn hosts in te voeren, realiseerde ik me ineens één ding — dit project zal eindigen, de hosts zullen veranderen en ik zal elke keer het script moeten aanpassen. Aan de ene kant is het niets ergs, het is immers een oplossing voor mezelf. Aan de andere kant, kijk eens naar wat dit oplevert:

Een aanblik niet voor bangeriken

Add-Type -assembly System.Windows.Forms #We maken de bibliotheek aan

$main_form = New-Object System.Windows.Forms.Form #We creëren een variabele voor ons "venster"

#We stellen parameters in via parameters
$main_form.Text ='Links actief' #Naam in de titel
$main_form.Width = 300 #Breedte van het venster
$main_form.Height = 200 #Hoogte van het venster
$main_form.AutoSize = $true #We geven het de mogelijkheid om zelf de grootte aan te passen indien nodig

$Label = New-Object System.Windows.Forms.Label #Alle elementen van het formulier worden in variabelen opgeslagen, maar in feite zijn dit objecten, zoals andere variabelen in Powershell
$Label.Text = "ya.ru		............................" #Te tonen tekst 
$Label.Location  = New-Object System.Drawing.Point(15,10) #Locatie van het object binnen het formulier horizontaal en verticaal (x,y)
$Label.AutoSize = $true 

$Label1 = New-Object System.Windows.Forms.Label #Alle elementen van het formulier worden in variabelen opgeslagen, maar in feite zijn dit objecten, zoals andere variabelen in Powershell
$Label1.Text = "8.8.8.8		............................" #Te tonen tekst googles DNS-adres
$Label1.Location  = New-Object System.Drawing.Point(15,30) #Locatie van het object binnen het formulier horizontaal en verticaal (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 #Object voor het weergeven van afbeeldingen heet heel logisch
$PictureBox.width = 10
$PictureBox.height = 10

#Hier gaan we verder met het binden van de te tonen afbeelding aan het resultaat van de bereikbaarheidstest met behulp van de cmdlet
#<b>test-connection</b>, waar:
#-Count - geeft het aantal verzoeken door
#-computer - IP of domeinnaam voor verzoek
#-quiet - zodat we alleen een Boolean waarde terugkrijgen
$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" #Object verwijst naar de bijbehorende afbeelding 
}
Else {
	$PictureBox.imageLocation = "C:Testno.png" #Object verwijst naar de bijbehorende afbeelding 
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox1 = New-Object system.Windows.Forms.PictureBox #Object voor het weergeven van afbeeldingen heet heel logisch
$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" #Object verwijst naar de bijbehorende afbeelding 
}
Else {
	$PictureBox1.imageLocation = "C:Testno.png" #Object verwijst naar de bijbehorende afbeelding 
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox2 = New-Object system.Windows.Forms.PictureBox #Object voor het weergeven van afbeeldingen heet heel logisch
$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" #Object verwijst naar de bijbehorende afbeelding 
}
Else {
	$PictureBox2.imageLocation = "C:Testno.png" #Object verwijst naar de bijbehorende afbeelding 
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox3 = New-Object system.Windows.Forms.PictureBox #Object voor het weergeven van afbeeldingen heet heel logisch
$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" #Object verwijst naar de bijbehorende afbeelding 
}
Else {
	$PictureBox3.imageLocation = "C:Testno.png" #Object verwijst naar de bijbehorende afbeelding 
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox4 = New-Object system.Windows.Forms.PictureBox #Object voor het weergeven van afbeeldingen heet heel logisch
$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" #Object verwijst naar de bijbehorende afbeelding 
}
Else {
	$PictureBox4.imageLocation = "C:Testno.png" #Object verwijst naar de bijbehorende afbeelding 
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox5 = New-Object system.Windows.Forms.PictureBox #Object voor het weergeven van afbeeldingen heet heel logisch
$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" #Object verwijst naar de bijbehorende afbeelding 
	}
Else {
	$PictureBox5.imageLocation = "C:Testno.png" #Object verwijst naar de bijbehorende afbeelding 
	}
$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 = "Herlaad"

# Koppelen aan de knopdruk gebeurtenis het aanspreken van elke PictureBox volgens eerder beschreven logica
$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) #voeg het gemaakte object toe aan het formulier, zodat het niet verloren gaat tijdens de uitvoering van het script
$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() #Roep het elementaire venster aan

Zelfs als je de netheid respecteert en de structuur aanhoudt, zal regelmatig bewerken niet de aangenaamste gevoelens oproepen.

Laten we de beschikbaarheid eerst in een aparte functie plaatsen en het pad naar de map in een aparte variabele:

$script_path	= "C:TestPS ping"

#We gaan naar de functie waar het bestaande object PictureBox en het IP-adres dat moet worden gecontroleerd zijn.
#Als resultaat verandert het de geladen afbeelding.
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"} 
	}

Laten we de gegevens over de host in een extern bestand path.txt plaatsen, waarbij we ze opschrijven als «ip/host-functionele-naam/», en in het document zullen we ze in arrays accepteren. We zullen ook de berekening van de Y-positie meer geautomatiseerd maken. Dit geeft ons de mogelijkheid om Labels en checkboxen aan te maken door de functie aan te roepen:

Hostbeschikbaarheid monitoring met Powershell

#создаем описательную линию, на вход идут: объект 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
	}

Laten we een plek toevoegen voor de tijd van de laatste controle, omdat dit handig is, en we zullen de actie bij het indrukken van de knop een beetje aanvullen.

Hostbeschikbaarheid monitoring met Powershell

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

Ook heb ik een kleine functie toegevoegd die, bij het ontdekken van een onbereikbare host, niet alleen de indicator verandert, maar ook uit de luidsprekers schreeuwt.

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

Dus na enkele versieringen en het overzichtelijk maken, ziet het er zo uit:

Volledige code van het script

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

#We gaan naar de functie met het al gemaakte PictureBox-object en het IP-adres dat gecontroleerd moet worden.
#Het verandert de afbeelding die wordt geladen.
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("Fout! Host " + $path_ip + ", niet beschikbaar!")
		}
	}

#We creëren een beschrijvende lijn, de invoer zijn: Label-object, IP-adres, beschrijving en Y-as positie
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
	}

#We creëren een indicator voor de beschrijvende lijn, de invoer zijn: PictureBox-object, IP-adres en Y-as positie
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' #Naam in de titel
$main_form.Width = 300 #Breedte van het venster
$main_form.Height = 200 #Hoogte van het venster
$main_form.AutoSize = $true #Geeft het de mogelijkheid om zichzelf aan te passen in grootte, indien nodig
$main_form.TopMost	= $true #Dit is erg belangrijk, het houdt het venster boven andere vensters vast

$line = Get-content -LiteralPath $script_path"path.txt" #Haal gegevens over benodigde hosts op
$len = $line.Length	#Bereken de lengte, dat wil zeggen, de arraylengte van elke regel

$i = 0

#Hierna verklaren we de arrays die verder nodig zijn
$ip	= @()	#IP-array
$capt	= @()	#Beschrijving-array
$Labels	=@()	#Label-array
$PictureBoxs	=@()	#PictureBox-array

while($i -lt $len){
	$f	= $line[$i].IndexOf("/") #Bepaal de positie van het begin van de beschrijving
	$l	= $line[$i].LastIndexOf("/")	#Bepaal de positie van het einde van de beschrijving
	$ip	+= $line[$i].Substring(0,$f)	#Haal IP op
	$capt	+= $line[$i].Substring($f+1,$l-$f-1)	#Haal beschrijving op

	#Creëer een Label-veld
	Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
	#Creëer een PictureBox-veld
	Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top

	$label_from_top	+= 15	#Geef een "stap" op de Y-as

	$Labels	+= $label_obj	#Voeg de gemaakte Label toe aan de algemene array
	$PictureBoxs	+= $PictureBox_obj	#Voeg de gemaakte PictureBox toe aan de algemene array
	$main_form.Controls.Add($Labels[$i])
	$main_form.Controls.Add($PictureBoxs[$i])
	$i	+=1
}

#Dit veld geeft de laatste controle-tijd weer
$Label0	= New-Object System.Windows.Forms.Label
$Label0.Text	= Get-Date
$Label0.Location	= New-Object System.Drawing.Point(80,180)
$Label0.AutoSize	= $true


#Koppel aan de knopdrukgebeurtenis voor elke PictureBox volgens de eerder beschreven logica
$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	= "Herlaad"

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

Naschrift

Ik hoop dat deze tutorial voor iemand nuttig zal zijn. Als je dit al vanaf jongs af aan deed, gefeliciteerd, ik - deed dat nog niet. Maar ik sta open voor je opmerkingen en suggesties.

Voor mij was het aangenaam om te graven en zo'n klein, maar nuttig hulpmiddel samen te stellen. Er zijn nog plannen om de functionaliteit voor het toevoegen en verwijderen van knooppunten via de GUI te implementeren, en om hetgeen te doen dat in eerste instantie gerealiseerd had moeten worden: automatische statusupdates zonder dat je op een knop hoeft te klikken, en zonder dat het 'powershell.exe' vastloopt.

De laatste versie van het script is op GitHub

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster