पॉवर्सशेल होस्ट उपलब्धता की निगरानी

अच्छा दिन, मैं एक सरल निर्देश साझा करना चाहता हूं "मैं एक दर्जन मेजबानों को मैन्युअल रूप से कैसे रोक सकता हूं। पंजीकरण और एसएमएस के बिना! ”

इंटरनेट से

महत्वपूर्ण : मैं एक प्रोग्रामर या सिस्टम प्रशासक नहीं हूं, लेकिन मुझे सर्वर और सेवाओं के एक बड़े सेट के साथ एक साथ काम करना है, और मैंने अपनी सुविधा के लिए यह स्क्रिप्ट लिखी है।

सभी के लिए जो यह उपयोगी, उत्सुक हो सकता है, मैं बिल्ली के नीचे पूछता हूं।


पॉवरशेल क्यों
मुझे सरल पायथन कार्यक्रम लिखने का अनुभव है, लेकिन इसके लिए या तो एक स्थापित दुभाषिया या चलाने के अधिकार की आवश्यकता होती है।। Exe, जो, मेरे काम के हिस्से के रूप में, हमेशा संभव नहीं है। लेकिन पॉवरशेल स्क्रिप्ट अक्सर चलाने की क्षमता पाती है।

सभी को कंसोल / टर्मिनल पसंद नहीं है


मुझे लगता है कि यह एक विरोधाभास नहीं है, अन्यथा हर कोई अभी भी कंसोल मेल क्लाइंट का उपयोग करेगा और जीयूआई * निक्स-सिस्टम में दिखाई नहीं देगा।

चूँकि रोज़मर्रा की ज़िंदगी में मुझे प्राइमशेल का इस्तेमाल प्राथमिक तौर पर करना होता है, एक शुरुआत के लिए मैंने यह समझने की कोशिश की कि क्या जीयूआई को बन्धन करना संभव है। यह पता चलता है कि आप कर सकते हैं, और यहां तक ​​कि काफी सरल:


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

इसमें एक आउटपुट एलिमेंट जोड़ें और एक एलिमेंटरी विंडवॉज़ टॉटोलॉजी विंडो प्राप्त करें ?


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

वक्ताओं को जोड़ें


तो जिस टूल से मैंने "पैंडिंग यैंडेक्स" और माउंटेड * .इसको एक अलग GUI मिला है, लेकिन यह पर्याप्त नहीं है। इसी तरह, आप पहुंच की जानकारी प्रदर्शित कर सकते हैं, लेकिन निगरानी के लिए आपको हर बार स्क्रिप्ट को फिर से शुरू करना होगा।

सबसे पहले, दो आइकन बनाएं और छवियों को प्रदर्शित करने की क्षमता जोड़ें।


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

फिर से हमारे DNS उपनाम शरारती हैं ...


और एक बटन जोड़ें ताकि आप रीडिंग को अपडेट कर सकें।


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


महान, अब उत्पादन में! ?


लगभग आधा दर्जन मेजबानों को मैन्युअल रूप से निर्धारित करने के बाद, मुझे अचानक एक बात का एहसास हुआ - लेकिन यह परियोजना समाप्त हो जाएगी, मेजबान बदल जाएंगे और मुझे हर बार स्क्रिप्ट को संपादित करना होगा। एक तरफ, यह ठीक है, यह खुद के लिए एक ही निर्णय है। दूसरी ओर, यह अपने आप को प्रिय के लिए एक निर्णय है, जो होता है उस पर एक नज़र डालें:

तमाशा दिल के बेहोश के लिए नहीं है
 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() #    

यहां तक ​​कि अगर आप स्वच्छता का निरीक्षण करते हैं और संरचना का पालन करते हैं, तो आवधिक संपादन सबसे सुखद संवेदनाओं का कारण नहीं होगा।

शुरू करने के लिए, हम एक अलग फ़ंक्शन में उपलब्धता की जाँच करें, और एक अलग चर में निर्देशिका पथ:

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

हम होस्ट डेटा को एक बाहरी path.txt फ़ाइल में स्थानांतरित करेंगे, इसे "आईपी / होस्ट-कार्यात्मक-नाम /" के रूप में लिखेंगे, और दस्तावेज़ में हम उन्हें सरणियों में ले जाएंगे। हम वाई स्थिति की गणना को और अधिक स्वचालित बनाते हैं। यह सब हमें फ़ंक्शन को कॉल करके लेबल और चेकबॉक्स बनाने का अवसर देता है:


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

हम अंतिम चेक के समय को प्रदर्शित करने के लिए एक स्थान जोड़ देंगे, क्योंकि यह सुविधाजनक है, और जब आप बटन पर क्लिक करेंगे तो हम थोड़ा सा एक्शन जोड़ देंगे।


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

और मैंने एक छोटी सी विशेषता को भी एक बग नहीं संलग्न किया, जो, जब एक दुर्गम मेजबान का पता लगाया गया था, तो न केवल संकेतक में बदलाव की सूचना दी, बल्कि वक्ताओं से भी चिल्लाया।

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

इसलिए कुछ अलंकरणों के बाद और मेरे लिए एक पठनीय रूप में सुविधाजनक रूप में लाना, यह इस तरह से निकला:

पूर्ण स्क्रिप्ट कोड
 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() 


अंतभाषण


मुझे आशा है कि किसी को यह ट्यूटोरियल उपयोगी लगेगा। यदि आपने लगभग पालना से किया है, तो बधाई हो, मैंने नहीं किया। लेकिन मैं आपकी टिप्पणियों और सुझावों को सुनने के लिए तैयार हूं।

मेरे लिए, आस-पास खुदाई करना और रोजमर्रा की जिंदगी में बस इतनी छोटी, लेकिन उपयोगी उपयोगिता एकत्र करना अच्छा था। योजनाओं को अभी भी जीयूआई से नोड्स को जोड़ने और हटाने को लागू करना है, साथ ही साथ वही काम करना है जो मुख्य रूप से स्वचालित स्थिति अपडेट को बटन को "पोक" करने की आवश्यकता के बिना लागू किया जाना चाहिए और ताकि यह "पॉवर्सशेल। Exe" लटका न हो।

GitHub पर स्क्रिप्ट का नवीनतम संस्करण

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


All Articles