इस लेख में हम सीखेंगे कि Invoke-Command cmdlet का उपयोग करके PowerShell कमांड या स्क्रिप्ट को रिमोटली कैसे चलाया जाए। आप अपने नेटवर्क में एक या अधिक कंप्यूटर्स पर कमांड को रिमोटली चलाने के लिए PowerShell का उपयोग कर सकते हैं। Invoke-Command cmdlet PowerShell Remoting से रिमोट मैनेजमेंट फीचर्स का उपयोग कर रहा है। PowerShell Remoting आपको WinRM (विंडोज रिमोट मैनेजमेंट) सर्विस और Web Services for Management (WS-Management) प्रोटोकॉल के माध्यम से कंप्यूटर्स पर PowerShell सत्रों से रिमोटली कनेक्ट करने की अनुमति देता है। यह सर्विस रिमोट PowerShell सत्र स्थापित करने और अपना कोड चलाने की क्षमता प्रदान करती है।
PowerShell Remoting के लिए WinRM कॉन्फिगर करना
PowerShell Remoting कंप्यूटर्स के बीच संचार के लिए HTTP (पोर्ट TCP/5985) या HTTPS (पोर्ट TCP/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 सेटिंग्स सेट करेगी, और विंडोज फ़ायरवॉल में अपवाद नियम जोड़ेगी। Enable-PSRemoting –Force कमांड बिना उपयोगकर्ता को प्रॉम्प्ट किए WinRM को सक्षम करती है।
फिर आप PowerShell Remoting का उपयोग करके कंप्यूटर से रिमोटली कनेक्ट कर सकते हैं।
ध्यान दें कि PowerShell Remoting डिफ़ॉल्ट रूप से काम नहीं करेगा यदि आपका नेटवर्क प्रकार Public पर सेट है। तब कमांड निम्न त्रुटि लौटाती है:
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.
आपको नेटवर्क स्थान को Private पर बदलना होगा या इस कमांड का उपयोग करना होगा:
Enable-PSRemoting –SkipNetworkProfileCheck.
साथ ही विंडोज डिफेंडर फ़ायरवॉल नियम को सक्षम करें जो पब्लिक नेटवर्क में WinRM तक पहुंच की अनुमति देता है। आप GPO या PowerShell का उपयोग करके फ़ायरवॉल नियम सक्षम कर सकते हैं:
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any
रिमोट कंप्यूटर पर PowerShell Remoting के माध्यम से कनेक्शन का परीक्षण करने के लिए, निम्न कमांड चलाएं:
Test-WsMan compname1
यदि आपके पास एक्टिव डायरेक्टरी डोमेन नहीं है या आप IP पतों के माध्यम से कंप्यूटर्स को PowerShell Remoting के माध्यम से एक्सेस करते हैं, तो इस मामले में NTLM प्रोटोकॉल का उपयोग प्रमाणीकरण के लिए किया जाता है। 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: the transport 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 सर्टिफिकेट जारी करें या होस्ट नाम/IP पते को Trusted Hosts सूची में जोड़ें:
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201
या आप सभी कंप्यूटर्स से कनेक्शन की अनुमति दे सकते हैं (इसकी अनुशंसा नहीं की जाती, क्योंकि यह NTLM के नुकसानों में से एक है — यह म्यूचुअल प्रमाणीकरण का समर्थन नहीं करता)।
Set-Item wsman:\localhost\Client\TrustedHosts -value *
यही सेटिंग्स रिमोट होस्ट्स पर भी लागू की जानी चाहिए।
Trusted hosts की सूची प्रदर्शित करने के लिए, कमांड चलाएं:
Get-Item WSMan:\localhost\Client\TrustedHosts
परिवर्तनों को लागू करने के लिए, WinRM रीस्टार्ट करें:
Restart-Service WinRM
आप ग्रुप पॉलिसी का उपयोग करके WinRM को सक्षम और कॉन्फिगर भी कर सकते हैं।
Invoke-Command का उपयोग करके PowerShell कमांड को रिमोटली कैसे चलाएं?
Invoke-Command cmdlet एक या अधिक रिमोट कंप्यूटर्स पर कमांड चलाने की अनुमति देता है।
उदाहरण के लिए, किसी रिमोट कंप्यूटर पर एक कमांड चलाने के लिए, निम्न का उपयोग करें:
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
यह कमांड रिमोट कंप्यूटर पर इंस्टॉल किए गए PowerShell संस्करण को प्रदर्शित करेगा, जिसका नाम -ComputerName पैरामीटर में निर्दिष्ट है। रिमोट कंप्यूटर पर चलाने के लिए कमांड को -ScriptBlock {[cmdlet]} ब्लॉक में दर्ज करें।
डिफ़ॉल्ट रूप से, Invoke-Command के माध्यम से भेजी गई कमांड को रिमोट कंप्यूटर पर वर्तमान उपयोगकर्ता के रूप में निष्पादित किया जाता है। यदि आप इसे किसी अन्य उपयोगकर्ता के रूप में चलाना चाहते हैं, तो उपयोगकर्ता क्रेडेंशियल्स का अनुरोध करें और उन्हें एक वेरिएबल में सहेजें:
$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}
यह PowerShell कमांड रिमोट कंप्यूटर पर नेटवर्क इंटरफेस की सूची प्रदर्शित करता है:
आप ScriptBlock में सेमीकोलन से अलग करके एक से अधिक कमांड दर्ज कर सकते हैं। उदाहरण के लिए, निम्न कमांड वर्तमान टाइम जोन प्रदर्शित करेगा और इसे दूसरे में बदल देगा:
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}
Invoke-Command आपको न केवल व्यक्तिगत कमांड चलाने की अनुमति देता है, बल्कि PowerShell स्क्रिप्ट भी चलाने की अनुमति देता है। ऐसा करने के लिए, –ScriptBlock के बजाय -FilePath आर्गुमेंट का उपयोग किया जाता है। इस मामले में, आप अपने कंप्यूटर पर स्थानीय PS1 स्क्रिप्ट फ़ाइल का पथ निर्दिष्ट करते हैं (आपको स्क्रिप्ट फ़ाइल को टारगेट रिमोट कंप्यूटर पर कॉपी करने की आवश्यकता नहीं है):
Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1
एक साथ कई कंप्यूटर्स पर कमांड चलाने के लिए Invoke-Command का उपयोग कैसे करें?
आप Invoke-Command का उपयोग करके एक साथ (सिमल्टेनियसली) कई रिमोट कंप्यूटर्स पर कमांड चला सकते हैं।
सबसे सरल मामले में, PowerShell कमांड चलाने के लिए कंप्यूटर्स के नाम कॉमा से अलग किए जाते हैं:
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 का उपयोग करके कंप्यूटर्स की सूची भी प्राप्त कर सकते हैं (PowerShell के लिए Active Directory मॉड्यूल से):
डोमेन में सभी विंडोज सर्वर होस्ट पर कमांड चलाने के लिए, निम्न PowerShell कोड का उपयोग करें:
$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinue
यदि कंप्यूटर बंद है या अनुपलब्ध है, तो स्क्रिप्ट SilentlyContinue पैरामीटर के कारण नहीं रुकेगी और अन्य कंप्यूटर्स पर चलती रहेगी।
यह समझने के लिए कि परिणाम किस कंप्यूटर से आया है, PSComputerNamee एनवायरनमेंट वेरिएबल का उपयोग करें।
$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime
Invoke-Command का उपयोग करके कई कंप्यूटर्स पर कमांड चलाते समय, यह सिमल्टेनियसली चलता है। Invoke-Command में एक साथ मैनेज किए जाने वाले कंप्यूटर्स की अधिकतम संख्या पर प्रतिबंध है (PSSessions की सीमित संख्या)। यह प्रतिबंध ThrottleLimit पैरामीटर में सेट है (डिफ़ॉल्ट मान 32 है)। यदि आप 32 से अधिक कंप्यूटर्स (उदाहरण के लिए 128) पर कमांड चलाना चाहते हैं, तो –ThrottleLimit 128 का उपयोग करें (हालांकि, बड़ी संख्या में PSSessions स्थापित करने के लिए आपके कंप्यूटर पर अधिक लोड होगा)।
Invoke-Command का उपयोग करके रिमोट कंप्यूटर्स पर बैकग्राउंड में कमांड चलाने के लिए, एक विशेष एट्रिब्यूट –AsJob का उपयोग किया जाता है। तब कमांड का परिणाम कंसोल पर वापस नहीं किया जाता है। परिणाम प्राप्त करने के लिए, Receive-Job cmdlet का उपयोग करें।