Surveillance de la disponibilité des hôtes sur Powershell

Bonjour à tous, je souhaite partager un simple guide « Comment arrêter de pinger manuellement une dizaine d'hôtes. Sans inscription ni SMS ! ».

Surveillance de la disponibilité des hôtes sur PowershellDes profondeurs d'Internet

Important: je ne suis ni programmeur ni administrateur système, mais je dois travailler simultanément avec un grand ensemble serveurs et de services, et j'ai écrit ce script pour ma propre commodité.

Tous ceux à qui cela pourrait être utile, je vous invite à lire la suite.

Pourquoi PowershellJ'ai de l'expérience dans l'écriture de programmes simples en Python, mais cela nécessite soit un interpréteur installé, soit des droits pour exécuter des .exe, ce qui, dans le cadre de mon travail, n'est pas toujours possible. En revanche, un script Powershell trouve plus souvent une possibilité de s'exécuter.

Tout le monde n'aime pas la console/terminal

Je pense qu'il n'y a pas de contradiction, sinon tout le monde utiliserait encore des clients de messagerie en mode console et les systèmes *nix n'auraient pas développé de GUI.

Comme j'ai souvent besoin d'utiliser Powershell de manière assez basique, j'ai d'abord essayé de voir s'il était possible d'y ajouter une GUI. Il s'avère que oui, et c'est assez simple :

Surveillance de la disponibilité des hôtes sur Powershell

Add-Type -assembly System.Windows.Forms #Ajoutons la bibliothèque
$main_form = New-Object System.Windows.Forms.Form #Créons un objet avec notre "fenêtre"

#Définissons ses paramètres
$main_form.Text ='Links up' #Nom dans le titre
$main_form.Width = 300 #Largeur de la fenêtre
$main_form.Height = 200 #Hauteur de la fenêtre
$main_form.AutoSize = $true #Lui permet de redimensionner automatiquement si nécessaire
$main_form.ShowDialog() #Appelons la "fenêtre"

Ajoutons un élément de sortie à cela et nous avons une fenêtre élémentaire de Windows, tautologie ?.

Surveillance de la disponibilité des hôtes sur Powershell

Add-Type -assembly System.Windows.Forms #Nous allons connecter la bibliothèque

$main_form = New-Object System.Windows.Forms.Form #Nous créons une variable avec notre "fenêtre"

#Nous définissons les paramètres via les paramètres
$main_form.Text ='Links up' #Nom dans l'en-tête
$main_form.Width = 300 #Largeur de la fenêtre
$main_form.Height = 200 #Hauteur de la fenêtre
$main_form.AutoSize = $true #Nous lui donnons la possibilité de redimensionner automatiquement si nécessaire

$Label = New-Object System.Windows.Forms.Label #Tous les éléments de la forme seront stockés dans des variables, mais en réalité, ce sont des objets, comme n'importe quelle autre variable dans Powershell
$Label.Text = "Bonjour! Je suis une fenêtre Windows élémentaire, et qu'as-tu accompli?" #Texte affiché
$Label.Location  = New-Object System.Drawing.Point(10,65) #Position de l'objet à l'intérieur de la forme horizontalement et verticalement (x,y)
$Label.AutoSize = $true 

$main_form.Controls.Add($Label) #Ajoutons l'objet créé au formulaire afin qu'il ne se perde pas lors de l'exécution du script

$main_form.ShowDialog() #Nous appelons la fenêtre élémentaire déplaisante

Ajoutons de la dynamisme

Ainsi, l'outil que j'ai utilisé pour « pinger Yandex » et monter des *.iso a obtenu une interface graphique séparée, mais ce n'est pas suffisant. De cette manière, nous pouvons afficher des informations sur la disponibilité, mais pour le monitoring, il faudra redémarrer le script à chaque fois.

Pour commencer, dessinons deux icônes et ajoutons la possibilité d'afficher des images.

Surveillance de la disponibilité des hôtes sur Powershell

$PictureBox = New-Object system.Windows.Forms.PictureBox #L'objet pour afficher les images est nommé de manière assez logique
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)

#Ici, nous passons à l'action en liant l'image à afficher au résultat de la vérification de la disponibilité du nœud à l'aide de la commande
#<b>test-connection</b>, où :
#-Count - transmet le nombre de requêtes
#-computer - IP ou nom de domaine pour la requête
#-quiet - pour que nous ne retournions qu'une valeur booléenne
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
	$PictureBox.imageLocation = "C:Testyes.png" #L'objet accède à l'image correspondante
}
Else {
	$PictureBox.imageLocation = "C:Testno.png" #L'objet accède à l'image correspondante
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$main_form.Controls.Add($PictureBox)

Encore une fois, nos DNS s'emballent…

Surveillance de la disponibilité des hôtes sur Powershell
Et ajoutons un bouton, afin d'avoir la possibilité de mettre à jour les données.

Surveillance de la disponibilité des hôtes sur 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 = "Reload"

# Nous attachons à l'événement de clic du bouton l'appel de chaque PictureBox selon la logique décrite précédemment
$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)

Surveillance de la disponibilité des hôtes sur Powershell

Super, maintenant en production!?

En ayant manuellement ajouté environ une demi-douzaine d'hôtes, j'ai réalisé une chose — ce projet va se terminer, les hôtes vont changer et je vais devoir corriger le script à chaque fois. D'un côté, rien de grave, c'est une solution pour moi. D'un autre côté, cette solution pour moi, regardez ce que cela donne :

Un spectacle pas pour les âmes sensibles

Add-Type -assembly System.Windows.Forms #Nous allons connecter la bibliothèque

$main_form = New-Object System.Windows.Forms.Form #Nous créons une variable pour notre "fenêtre"

#Définissons les paramètres à travers les paramètres
$main_form.Text ='Liens en cours' #Nom dans le titre
$main_form.Width = 300 #Largeur de la fenêtre
$main_form.Height = 200 #Hauteur de la fenêtre
$main_form.AutoSize = $true #Permettons-lui d'ajuster automatiquement sa taille si nécessaire

$Label = New-Object System.Windows.Forms.Label #Tous les éléments du formulaire seront stockés dans des variables, mais en fait ce sont des objets, comme toutes les autres variables dans Powershell
$Label.Text = "ya.ru		............................" #Texte affiché
$Label.Location  = New-Object System.Drawing.Point(15,10) #Position de l'objet dans le formulaire horizontalement et verticalement (x,y)
$Label.AutoSize = $true 

$Label1 = New-Object System.Windows.Forms.Label #Tous les éléments du formulaire seront stockés dans des variables, mais en fait ce sont des objets, comme toutes les autres variables dans Powershell
$Label1.Text = "8.8.8.8		............................" #Texte affiché, DNS de Google
$Label1.Location  = New-Object System.Drawing.Point(15,30) #Position de l'objet dans le formulaire horizontalement et verticalement (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 #L'objet pour afficher des images est nommé de manière assez logique
$PictureBox.width = 10
$PictureBox.height = 10

#Ici nous allons au cœur du sujet en liant l'image affichée au résultat de la vérification de l'accessibilité de l'hôte en utilisant la commande
#<b>test-connection</b>, où :
#-Count - transmet le nombre de requêtes
#-computer - IP ou nom de domaine pour la requête
#-quiet - pour que nous recevions uniquement une valeur booléenne
$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" # L'objet fait référence à l'image correspondante 
}
Else {
	$PictureBox.imageLocation = "C:Testno.png" # L'objet fait référence à l'image correspondante 
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox1 = New-Object system.Windows.Forms.PictureBox # L'objet pour afficher les images est nommé de façon logique
$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" # L'objet fait référence à l'image correspondante 
}
Else {
	$PictureBox1.imageLocation = "C:Testno.png" # L'objet fait référence à l'image correspondante 
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox2 = New-Object system.Windows.Forms.PictureBox # L'objet pour afficher les images est nommé de façon logique
$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" # L'objet fait référence à l'image correspondante 
}
Else {
	$PictureBox2.imageLocation = "C:Testno.png" # L'objet fait référence à l'image correspondante 
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox3 = New-Object system.Windows.Forms.PictureBox # L'objet pour afficher les images est nommé de façon logique
$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" # L'objet fait référence à l'image correspondante 
}
Else {
	$PictureBox3.imageLocation = "C:Testno.png" # L'objet fait référence à l'image correspondante 
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox4 = New-Object system.Windows.Forms.PictureBox # L'objet pour afficher les images est nommé de façon logique
$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" # L'objet fait référence à l'image correspondante 
}
Else {
	$PictureBox4.imageLocation = "C:Testno.png" # L'objet fait référence à l'image correspondante 
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox5 = New-Object system.Windows.Forms.PictureBox # L'objet pour afficher les images est nommé de façon logique
$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" # L'objet fait référence à l'image correspondante 
	}
Else {
	$PictureBox5.imageLocation = "C:Testno.png" # L'objet fait référence à l'image correspondante 
	}
$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 = "Rafraîchir"

# Associons l'événement de clic du bouton à chaque PictureBox selon la logique décrite précédemment
$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) # ajoutons l'objet créé au formulaire pour qu'il ne soit pas perdu pendant l'exécution du 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() # Appelons la fenêtre élémentaire

Même en respectant la propreté et la structure, l'édition périodique provoquera des sensations peu agréables.

Tout d'abord, nous déplaçons la vérification de disponibilité dans une fonction distincte et le chemin du répertoire dans une variable distincte :

$script_path	= "C:TestPS ping"

# Déplacez-vous dans la fonction de l'objet PictureBox déjà créé et l'adresse IP à vérifier.
# En sortie, cela change l'image chargée.
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"} 
	}

Nous extrairons les données sur l'hôte dans un fichier externe path.txt, sous la forme «ip/host-nom-fonctionnel/», et dans le document, nous les accepterons sous forme de tableaux. Nous automatiserons également le calcul de la position Y. Tout cela nous donne la possibilité de créer des Labels et des checkboxes en appelant une fonction :

Surveillance de la disponibilité des hôtes sur 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
	}

Ajoutons un espace pour afficher l'heure de la dernière vérification, car c'est pratique, et complétons légèrement l'action lors du clic sur le bouton.

Surveillance de la disponibilité des hôtes sur 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 
	})

J'ai également ajouté une petite fonctionnalité, qui, en cas de détection d'un hôte inaccessible, signale non seulement par le changement de l'indicateur, mais également en criant depuis les haut-parleurs.

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

Donc, après quelques embellissements et après l'avoir rendu lisible et pratique, cela donne ceci :

Code complet du 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

# Nous allons dans la fonction déjà créée avec l'objet PictureBox et l'adresse IP à vérifier.
# En sortie, il change l'image chargée.
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("Erreur! Hôte " + $path_ip + ", inaccessible!")
		}
	}

# Créons une ligne descriptive, les entrées sont : objet Label, adresse IP, description et position sur l'axe 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
	}

# Créons un indicateur pour la ligne descriptive, les entrées sont : objet PictureBox, adresse IP et position sur l'axe 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 ='Liens actifs' # Nom dans l'en-tête
$main_form.Width = 300 # Largeur de la fenêtre
$main_form.Height = 200 # Hauteur de la fenêtre
$main_form.AutoSize = $true # Permet au formulaire de redimensionner automatiquement si nécessaire
$main_form.TopMost	= $true # Ceci est très important, cela permet de maintenir la fenêtre au-dessus des autres

$line = Get-content -LiteralPath $script_path"path.txt" # Extraire les données sur les hôtes nécessaires
$len = $line.Length	# Calculer la longueur, c'est-à-dire la longueur du tableau de chaque ligne

$i = 0

# Ensuite, déclarons les tableaux nécessaires
$ip	= @()	# tableau d'ip
$capt	= @()	# tableau de description
$Labels	=@()	# tableau de Label
$PictureBoxs	=@()	# tableau de PictureBox

while($i -lt $len){
	$f	= $line[$i].IndexOf("/") # Calculer la position de début de la description
	$l	= $line[$i].LastIndexOf("/")	# Calculer la position de fin de la description
	$ip	+= $line[$i].Substring(0,$f)	# Extraire l'ip
	$capt	+= $line[$i].Substring($f+1,$l-$f-1)	# Extraire la description

	# Créer le champ Label
	Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
	# Créer le champ PictureBox
	Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top

	$label_from_top	+= 15	# Faire un "pas" sur l'axe Y

	$Labels	+= $label_obj	# Ajouter le Label créé au tableau général
	$PictureBoxs	+= $PictureBox_obj	# Ajouter le PictureBox créé au tableau général
	$main_form.Controls.Add($Labels[$i])
	$main_form.Controls.Add($PictureBoxs[$i])
	$i	+=1
}

# Ce champ contient le dernier temps de vérification
$Label0	= New-Object System.Windows.Forms.Label
$Label0.Text	= Get-Date
$Label0.Location	= New-Object System.Drawing.Point(80,180)
$Label0.AutoSize	= $true


# Attacher l'événement de clic de chaque PictureBox selon la logique décrite précédemment
$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	= "Rafraîchir"

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

Postface

J'espère que ce tutoriel sera utile à quelqu'un. Si vous avez fait cela presque depuis votre enfance, félicitations, moi je ne l'ai pas fait. Mais je suis prêt à écouter vos commentaires et suggestions.

Pour moi, c'était agréable d'explorer et de rassembler ce petit outil, utile au quotidien. Je prévois d'ajouter la fonctionnalité de gestion des nœuds via l'interface graphique et de mettre en place ce qui aurait dû être fait en premier lieu : la mise à jour automatique des statuts sans avoir à cliquer sur un bouton et sans que cela ne bloque 'powershell.exe'.

La dernière version du script est sur GitHub

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster