Monitoramento de disponibilidade do host do Powershell

Bom dia, quero compartilhar uma instrução simples "Como posso parar manualmente de executar ping em uma dúzia de hosts. Sem registro e SMS! ”

Da Internet

Importante : Não sou programador ou administrador de sistemas, mas tenho que trabalhar simultaneamente com um grande conjunto de servidores e serviços e escrevi esse script para minha própria conveniência.

Para todos os que acham isso útil, curioso, pergunto em gato.


Por que o PowerShell
Tenho experiência em escrever programas simples em Python, mas requer um intérprete instalado ou o direito de executar .exe, que, como parte do meu trabalho, nem sempre é possível. Mas o script do Powershell geralmente encontra a capacidade de executar.

Nem todo mundo adora o console / terminal


Eu acho que isso não é uma contradição, caso contrário, todos ainda usariam clientes de email do console e uma GUI não apareceria nos sistemas * nix.

Como na vida cotidiana eu tenho que usar o Powershell de maneira bastante primitiva, para começar, tentei entender se é possível fixar a GUI nele. Acontece que você pode, e até bem simples:


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() # "" 

Adicione um elemento de saída a isso e obtenha uma janela de tautologia elementar do Windwows ? .


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

Adicionar alto-falantes


Portanto, a ferramenta com a qual eu “sibilei o Yandex” e montei o * .iso obteve uma GUI separada, mas isso não é suficiente. Da mesma forma, você pode exibir informações de acessibilidade, mas para monitorar, você precisará reiniciar o script a cada vez.

Primeiro, desenhe dois ícones e adicione a capacidade de exibir imagens.


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

Novamente, nossos apelidos DNS são impertinentes ...


E adicione um botão para que você possa atualizar as leituras.


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


Ótimo, agora em produção! ?


Tendo prescrito manualmente cerca de meia dúzia de hosts, de repente percebi uma coisa - mas esse projeto terminará, os hosts mudarão e eu terei que editar o script todas as vezes. Por um lado, tudo bem, é a mesma decisão para você. Por outro lado, esta é uma decisão para si mesmo, dê uma olhada no que acontece:

O espetáculo não é para os fracos de coração
 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() #    

Mesmo se você observar a limpeza e aderir à estrutura, a edição periódica não causará as sensações mais agradáveis.

Para começar, fazemos a verificação de disponibilidade em uma função separada e o caminho do diretório em uma variável separada:

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

Transferiremos os dados do host para um arquivo path.txt externo, gravando-o na forma de "ip / host-functional-name /", e no documento, os levaremos para matrizes. Também tornamos o cálculo da posição Y mais automatizado. Tudo isso nos dá a oportunidade de criar etiquetas e caixas de seleção chamando a função:


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

Adicionaremos um local para exibir a hora da última verificação, porque é conveniente, e adicionaremos uma ação ao clicar no botão.


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

E também anexei um pequeno recurso, não um bug , que, quando um host inacessível foi detectado, relatou não apenas uma alteração no indicador, mas também gritou pelos alto-falantes.

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

Então, depois de alguns enfeites e trazer uma aparência legível conveniente para mim , ficou assim:

Código de script completo
 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() 


Posfácio


Espero que alguém ache este tutorial útil. Se você quase fez isso do berço, parabéns, eu não fiz. Mas estou pronto para ouvir seus comentários e sugestões.

Para mim, foi bom procurar e coletar um utilitário tão pequeno, mas útil, na vida cotidiana. Os planos ainda precisam implementar a adição e remoção de nós da GUI, bem como fazer a mesma coisa que deveria ter sido implementada, principalmente atualizações de status automáticas, sem a necessidade de "apertar" o botão e para não travar "powershell.exe".

A versão mais recente do script no GitHub

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


All Articles