इस लेख में हम सीखेंगे कि आमंत्रण-आदेश . का उपयोग कैसे करें cmdlet दूरस्थ रूप से PowerShell कमांड या स्क्रिप्ट चलाने के लिए। आप अपने नेटवर्क में एक या अधिक कंप्यूटरों पर दूरस्थ रूप से कमांड चलाने के लिए पावरशेल का उपयोग कर सकते हैं। Invoke-Command cmdlet PowerShell Remoting की दूरस्थ प्रबंधन सुविधाओं का उपयोग कर रहा है . पावरशेल रिमोटिंग आपको WinRM . के माध्यम से कंप्यूटर पर पावरशेल सत्रों से दूरस्थ रूप से कनेक्ट करने की अनुमति देता है (Windows दूरस्थ प्रबंधन) सेवा और प्रबंधन के लिए वेब सेवाएँ (WS-प्रबंधन) प्रोटोकॉल। यह सेवा दूरस्थ पावरशेल सत्र स्थापित करने और आपके कोड को चलाने की क्षमता प्रदान करती है।
पावरशेल रिमोटिंग के लिए WinRM को कॉन्फ़िगर करना
पावरशेल रिमोटिंग कंप्यूटर के बीच संचार करने के लिए HTTP (पोर्ट टीसीपी/5985) या एचटीटीपीएस (पोर्ट टीसीपी/5986) का उपयोग करता है। डिफ़ॉल्ट रूप से, HTTP प्रोटोकॉल का उपयोग किया जाता है, लेकिन यहां तक कि इस ट्रैफ़िक को AES-56 का उपयोग करके एन्क्रिप्ट किया गया है (हालांकि, मध्य प्रकार के हमलों का खतरा है)। Kerberos या NTLM प्रमाणीकरण का भी उपयोग किया जा सकता है।
WinRM उन दूरस्थ कंप्यूटरों पर चलना चाहिए जिनसे आप कनेक्ट होने जा रहे हैं। WinRM सेवा की स्थिति जांचें:
Get-Service -Name "*WinRM*" | fl
अगर सेवा नहीं चल रही है, तो इसे शुरू करें:
Enable-PSRemoting
WinRM has been updated to receive requests. WinRM service started. WinRM is already set up for remote management on this computer.
यह आदेश WinRM सेवा प्रारंभ करेगा (और इसे स्वचालित रूप से प्रारंभ करने के लिए सेट करेगा), डिफ़ॉल्ट winrm सेटिंग्स सेट करें, और Windows फ़ायरवॉल में अपवाद नियम जोड़ें। Enable-PSRemoting –Force
कमांड किसी उपयोगकर्ता को संकेत दिए बिना WinRM को सक्षम बनाता है।
फिर आप पॉवरशेल रिमोटिंग का उपयोग करके दूरस्थ रूप से कंप्यूटर से कनेक्ट कर सकते हैं।
ध्यान दें कि यदि आपका नेटवर्क प्रकार सार्वजनिक पर सेट है, तो PowerShell Remoting डिफ़ॉल्ट रूप से कार्य नहीं करेगा . फिर कमांड निम्न त्रुटि देता है:Set-WSManQuickConfig : ... WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.
आपको नेटवर्क स्थान को निजी में बदलना होगा या इस आदेश का उपयोग करना होगा:
Enable-PSRemoting –SkipNetworkProfileCheck.
विंडोज डिफेंडर फ़ायरवॉल नियम को भी सक्षम करें जो सार्वजनिक नेटवर्क में WinRM तक पहुंच की अनुमति देता है। आप GPO या PowerShell का उपयोग करके फ़ायरवॉल नियम को सक्षम कर सकते हैं:
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any
पावरशेल रिमोटिंग के माध्यम से किसी दूरस्थ कंप्यूटर से कनेक्शन का परीक्षण करने के लिए, निम्न आदेश चलाएँ:
Test-WsMan compname1
यदि आपके पास एक सक्रिय निर्देशिका डोमेन नहीं है या आप आईपी पते द्वारा पावरशेल रिमोटिंग के माध्यम से कंप्यूटर तक पहुंचते हैं, तो इस मामले में प्रमाणीकरण के लिए एनटीएलएम प्रोटोकॉल का उपयोग किया जाता है। NTLM का उपयोग करते समय, यदि आप Invoke-Command चलाने का प्रयास करते हैं, तो निम्न त्रुटि दिखाई देती है:
[192.168.1.201] Connecting to remote server 192.168.1.102 failed with the following error message: The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: thetransport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. + FullyQualifiedErrorId: CannotUseIPAddress,PSSessionStateBroken
कनेक्ट करने के लिए आप जिस कंप्यूटर का उपयोग कर रहे हैं उस पर NTLM प्रमाणीकरण सही ढंग से काम करने के लिए, कुछ और काम करें:WinRM के लिए SSL प्रमाणपत्र जारी करें या विश्वसनीय होस्ट सूची में होस्ट नाम/आईपी पता जोड़ें:
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201
या आप सभी कंप्यूटरों से कनेक्शन की अनुमति दे सकते हैं (यह अनुशंसित नहीं है, क्योंकि यह एनटीएलएम के नुकसानों में से एक है - यह पारस्परिक प्रमाणीकरण का समर्थन नहीं करता है)।
Set-Item wsman:\localhost\Client\TrustedHosts -value *
दूरस्थ होस्ट पर समान सेटिंग लागू की जानी चाहिए।
विश्वसनीय मेजबानों की सूची प्रदर्शित करने के लिए, कमांड चलाएँ:
Get-Item WSMan:\localhost\Client\TrustedHosts
परिवर्तनों को लागू करने के लिए, WinRM को पुनरारंभ करें:
Restart-Service WinRM
इनवोक-कमांड का उपयोग करके दूरस्थ रूप से पावरशेल कमांड कैसे चलाएं?
Invoke-Command cmdlet एक या अधिक दूरस्थ कंप्यूटरों पर कमांड चलाने की अनुमति देता है।
उदाहरण के लिए, किसी दूरस्थ कंप्यूटर पर एकल कमांड चलाने के लिए, निम्न का उपयोग करें:
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
यह कमांड दूरस्थ कंप्यूटर पर स्थापित पावरशेल संस्करण को प्रदर्शित करेगा, जिसका नाम -ComputerName
में निर्दिष्ट है पैरामीटर। दूरस्थ कंप्यूटर पर चलाने के लिए -ScriptBlock {[cmdlet]}
में कमांड दर्ज करें ब्लॉक करें।
डिफ़ॉल्ट रूप से, Invoke-Command के माध्यम से भेजी गई एक कमांड को दूरस्थ कंप्यूटर पर वर्तमान उपयोगकर्ता के रूप में निष्पादित किया जाता है। यदि आप इसे किसी अन्य उपयोगकर्ता के रूप में चलाना चाहते हैं, तो उपयोगकर्ता क्रेडेंशियल का अनुरोध करें और उन्हें एक चर में सहेजें:
$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}
यह पॉवरशेल कमांड दूरस्थ कंप्यूटर पर नेटवर्क इंटरफेस की सूची प्रदर्शित करता है:
आप ScriptBlock में अर्धविराम से अलग करके एक से अधिक कमांड दर्ज कर सकते हैं। उदाहरण के लिए, निम्न कमांड वर्तमान समय क्षेत्र को प्रदर्शित करेगा और इसे दूसरे समय क्षेत्र में बदल देगा:
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}
इनवोक-कमांड आपको न केवल व्यक्तिगत कमांड चलाने की अनुमति देता है, बल्कि पावरशेल स्क्रिप्ट भी चलाता है। ऐसा करने के लिए, -फाइलपाथ तर्क (-स्क्रिप्टब्लॉक के बजाय) का उपयोग किया जाता है। इस स्थिति में, आप अपने कंप्यूटर पर स्थानीय PS1 स्क्रिप्ट फ़ाइल का पथ निर्दिष्ट करते हैं (आपको स्क्रिप्ट फ़ाइल को लक्ष्य दूरस्थ कंप्यूटर पर कॉपी करने की आवश्यकता नहीं है):
Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1
एक साथ कई कंप्यूटरों पर कमांड चलाने के लिए इनवोक-कमांड का उपयोग कैसे करें?
आप समानांतर में (एक साथ) कई दूरस्थ कंप्यूटरों पर कमांड चलाने के लिए Invoke-Command का उपयोग कर सकते हैं।
सरलतम स्थिति में, पावरशेल कमांड को चलाने वाले कंप्यूटरों के नाम अल्पविराम से अलग किए जाते हैं:
Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
आप कंप्यूटर की सूची को एक वेरिएबल (सरणी) में रख सकते हैं:
$servers = @("server1","server2","server3")
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers
या टेक्स्ट फ़ाइल से प्राप्त करें:
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)
आप पावरशेल मॉड्यूल के लिए AD से Get-ADComputer cmdlet का उपयोग करके AD में कंप्यूटरों की सूची भी प्राप्त कर सकते हैं:
डोमेन में सभी विंडोज सर्वर होस्ट में कमांड चलाने के लिए, निम्नलिखित पावरशेल कोड का उपयोग करें:
$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinue
यदि कंप्यूटर बंद है या अनुपलब्ध है, तो साइलेंटली कॉन्टिन्यू पैरामीटर के कारण स्क्रिप्ट बंद नहीं होगी और अन्य कंप्यूटरों पर चलती रहेगी।
यह समझने के लिए कि परिणाम किस कंप्यूटर से आया है, PSComputerNamee पर्यावरण चर का उपयोग करें।
$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime
कई कंप्यूटरों पर Invoke-Command का उपयोग करते हुए एक कमांड चलाते समय, इसे एक साथ चलाया जाता है। Invoke-Command में एक ही समय में प्रबंधित किए जाने वाले कंप्यूटरों की अधिकतम संख्या (एक साथ PSSessions की सीमित संख्या) पर प्रतिबंध है। यह प्रतिबंध थ्रॉटल लिमिट . में सेट है पैरामीटर (डिफ़ॉल्ट मान 32 है)। यदि आप 32 से अधिक कंप्यूटरों (उदाहरण के लिए, 128) पर कमांड चलाना चाहते हैं, तो –ThrottleLimit 128
का उपयोग करें। (हालांकि, बड़ी संख्या में PSSSessions स्थापित करने के लिए आपके कंप्यूटर का लोड अधिक होगा)।
पृष्ठभूमि में इनवोक-कमांड के माध्यम से दूरस्थ कंप्यूटर पर कमांड चलाने के लिए, एक विशेष विशेषता –AsJob
प्रयोग किया जाता है। तब कमांड का परिणाम कंसोल पर वापस नहीं किया जाता है। परिणाम प्राप्त करने के लिए, प्राप्त-नौकरी . का उपयोग करें cmdlet.