PowerShell
पॉवरशेल रेमोटिंग
खोज…
टिप्पणियों
पॉवरशेल रेमोटिंग को सक्षम करना
PowerShell रीमोटिंग को पहले उस सर्वर पर सक्षम किया जाना चाहिए जिससे आप दूरस्थ रूप से कनेक्ट करना चाहते हैं।
Enable-PSRemoting -Force
यह आदेश निम्न कार्य करता है:
- सेट-WSManQuickConfig cmdlet चलाता है, जो निम्नलिखित कार्य करता है:
- WinRM सेवा शुरू करता है।
- WinRM सेवा पर स्टार्टअप प्रकार को स्वचालित पर सेट करता है।
- यदि कोई पहले से मौजूद नहीं है, तो किसी भी आईपी पते पर अनुरोध स्वीकार करने के लिए एक श्रोता बनाता है।
- WS- प्रबंधन संचार के लिए एक फ़ायरवॉल अपवाद को सक्षम करता है।
- Microsoft.PowerShell और Microsoft.PowerShell.Workflow सत्र कॉन्फ़िगरेशन पंजीकृत करता है, अगर यह पहले से पंजीकृत नहीं हैं।
- यदि यह पहले से पंजीकृत नहीं है, तो Microsoft.owerShell32 सत्र 64-बिट कंप्यूटर पर कॉन्फ़िगरेशन को पंजीकृत करता है।
- सभी सत्र कॉन्फ़िगरेशन को सक्षम करता है।
- दूरस्थ पहुँच की अनुमति देने के लिए सभी सत्र कॉन्फ़िगरेशन के सुरक्षा डिस्क्रिप्टर को बदलता है।
- पूर्ववर्ती परिवर्तनों को प्रभावी बनाने के लिए WinRM सेवा को पुनरारंभ करता है।
केवल गैर-डोमेन वातावरण के लिए
AD डोमेन के सर्वर के लिए PS रीमोटिंग प्रमाणीकरण Kerberos ('डिफ़ॉल्ट'), या NTLM ('नेगोशिएट') के माध्यम से किया जाता है। यदि आप एक गैर-डोमेन सर्वर को रीमोट करने की अनुमति देना चाहते हैं तो आपके पास दो विकल्प हैं।
या तो HTTPS (जिसमें सर्टिफिकेशन जनरेशन की आवश्यकता होती है) पर WSMan कम्युनिकेशन सेट करें या बेसिक ऑथेंटिकेशन को सक्षम करें, जो आपके क्रेडेंशियल्स को वायर बेस 64-इनकोडेड में भेजता है (जो कि मूल रूप से प्लेन-टेक्स्ट के समान ही होता है इसलिए इससे सावधान रहें)।
या तो मामले में आपको दूरस्थ प्रणाली को अपने WSMan विश्वसनीय होस्ट सूची में जोड़ना होगा।
मूल प्रमाणीकरण सक्षम करना
Set-Item WSMan:\localhost\Service\AllowUnencrypted $true
फिर कंप्यूटर आप से कनेक्ट करना चाहते हैं पर, आप कंप्यूटर आप कनेक्ट कर रहे भरोसा करना यह बताना होगा।
Set-Item WSMan:\localhost\Client\TrustedHosts '192.168.1.1,192.168.1.2'
Set-Item WSMan:\localhost\Client\TrustedHosts *.contoso.com
Set-Item WSMan:\localhost\Client\TrustedHosts *
महत्वपूर्ण : आपको अपने क्लाइंट को उस कंप्यूटर पर भरोसा करने के लिए कहना होगा जिस तरह से आप कनेक्ट करना चाहते हैं (जैसे यदि आप आईपी के माध्यम से कनेक्ट करते हैं, तो उसे आईपी पर भरोसा करना चाहिए मेजबाननाम नहीं)
PowerShell के माध्यम से एक दूरस्थ सर्वर से कनेक्ट करना
अपने स्थानीय कंप्यूटर से क्रेडेंशियल्स का उपयोग करना:
Enter-PSSession 192.168.1.1
दूरस्थ कंप्यूटर पर क्रेडेंशियल्स के लिए संकेत देना
Enter-PSSession 192.168.1.1 -Credential $(Get-Credential)
रिमोट कंप्यूटर पर कमांड चलाएं
एक बार Powershell remoting सक्षम है (सक्षम-PSRemoting) आप इस तरह दूरस्थ कंप्यूटर पर कमांड चला सकते हैं:
Invoke-Command -ComputerName "RemoteComputerName" -ScriptBlock {
Write host "Remote Computer Name: $ENV:ComputerName"
}
उपरोक्त विधि एक अस्थायी सत्र बनाती है और कमांड या स्क्रिप्टब्लॉक समाप्त होने के ठीक बाद इसे बंद कर देती है।
सत्र को खुला छोड़ने और बाद में अन्य कमांड चलाने के लिए, आपको पहले एक दूरस्थ सत्र बनाने की आवश्यकता है:
$Session = New-PSSession -ComputerName "RemoteComputerName"
जब आप दूरस्थ कंप्यूटर पर आदेशों को लागू करते हैं तो आप इस सत्र का उपयोग कर सकते हैं:
Invoke-Command -Session $Session -ScriptBlock {
Write host "Remote Computer Name: $ENV:ComputerName"
}
Invoke-Command -Session $Session -ScriptBlock {
Get-Date
}
यदि आपको अलग-अलग क्रेडेंशियल्स का उपयोग करने की आवश्यकता है, तो आप उन्हें -Credential
Parameter के साथ जोड़ सकते हैं:
$Cred = Get-Credential
Invoke-Command -Session $Session -Credential $Cred -ScriptBlock {...}
धारावाहिक चेतावनी चेतावनी
ध्यान दें:
यह जानना महत्वपूर्ण है कि रिमोट सिस्टम पर पॉवरशेल ऑब्जेक्ट्स को रिमूव करते हैं और रीमोटिंग सत्र के अंत में उन्हें डीरियलाइज़ करते हैं, अर्थात वे ट्रांसपोर्ट के दौरान एक्सएमएल में परिवर्तित हो जाते हैं और अपने सभी तरीकों को खो देते हैं।
$output = Invoke-Command -Session $Session -ScriptBlock {
Get-WmiObject -Class win32_printer
}
$output | Get-Member -MemberType Method
TypeName: Deserialized.System.Management.ManagementObject#root\cimv2\Win32_Printer
Name MemberType Definition
---- ---------- ----------
GetType Method type GetType()
ToString Method string ToString(), string ToString(string format, System.IFormatProvi...
जबकि आपके पास नियमित PS ऑब्जेक्ट पर विधियाँ हैं:
Get-WmiObject -Class win32_printer | Get-Member -MemberType Method
TypeName: System.Management.ManagementObject#root\cimv2\Win32_Printer
Name MemberType Definition
---- ---------- ----------
CancelAllJobs Method System.Management.ManagementBaseObject CancelAllJobs()
GetSecurityDescriptor Method System.Management.ManagementBaseObject GetSecurityDescriptor()
Pause Method System.Management.ManagementBaseObject Pause()
PrintTestPage Method System.Management.ManagementBaseObject PrintTestPage()
RenamePrinter Method System.Management.ManagementBaseObject RenamePrinter(System.String NewPrinterName)
Reset Method System.Management.ManagementBaseObject Reset()
Resume Method System.Management.ManagementBaseObject Resume()
SetDefaultPrinter Method System.Management.ManagementBaseObject SetDefaultPrinter()
SetPowerState Method System.Management.ManagementBaseObject SetPowerState(System.UInt16 PowerState, System.String Time)
SetSecurityDescriptor Method System.Management.ManagementBaseObject SetSecurityDescriptor(System.Management.ManagementObject#Win32_SecurityDescriptor Descriptor)
तर्क उपयोग
दूरस्थ स्क्रिप्टिंग ब्लॉक के लिए मापदंडों के रूप में तर्कों का उपयोग करने के लिए, व्यक्ति या तो Invoke-Command
के ArgumentList
पैरामीटर का उपयोग कर सकता है, या $Using:
सिंटैक्स।
का उपयोग करते हुए ArgumentList
(क्रम में वे scriptblock को पास किया जाता में यानी) अज्ञात पैरामीटर के साथ:
$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ArgumentList $servicesToShow,$fileName -ScriptBlock {
Write-Host "Calling script block remotely with $($Args.Count)"
Get-Service -Name $args[0]
Remove-Item -Path $args[1] -ErrorAction SilentlyContinue -Force
}
नामित मापदंडों के साथ ArgumentList
का उपयोग करना:
$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ArgumentList $servicesToShow,$fileName -ScriptBlock {
Param($serviceToShowInRemoteSession,$fileToDelete)
Write-Host "Calling script block remotely with $($Args.Count)"
Get-Service -Name $serviceToShowInRemoteSession
Remove-Item -Path $fileToDelete -ErrorAction SilentlyContinue -Force
}
$Using:
वाक्य रचना:
$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ScriptBlock {
Get-Service $Using:servicesToShow
Remove-Item -Path $fileName -ErrorAction SilentlyContinue -Force
}
स्वचालित रूप से सफाई PSSession के लिए एक सर्वोत्तम अभ्यास
जब New-PSsession
cmdlet के माध्यम से एक दूरस्थ सत्र बनाया जाता है, तो PSSession वर्तमान PowerShell सत्र समाप्त होने तक बना रहता है। मतलब, डिफ़ॉल्ट रूप से, PSSession
और सभी संबद्ध संसाधन वर्तमान PowerShell सत्र के समाप्त होने तक उपयोग किए जाते रहेंगे।
एकाधिक सक्रिय PSSessions
संसाधनों पर एक तनाव बन सकता है, विशेष रूप से लंबे समय तक चलने या इंटरलिंक की गई स्क्रिप्ट के लिए जो किसी एकल PowerShell सत्र में PSSessions
सैकड़ों बनाते हैं।
यह उपयोग किए जाने के बाद प्रत्येक PSSession
को स्पष्ट रूप से हटाने के लिए सबसे अच्छा अभ्यास है। [1]
निम्न कोड टेम्पलेट ऊपर प्राप्त करने के लिए try-catch-finally
का उपयोग करता है, सभी बनाए गए PSSessions
सुनिश्चित करने के लिए एक सुरक्षित तरीके से त्रुटि हैंडलिंग के संयोजन को समाप्त कर दिया जाता है जब उनका उपयोग किया जा रहा हो:
try
{
$session = New-PSsession -Computername "RemoteMachineName"
Invoke-Command -Session $session -ScriptBlock {write-host "This is running on $ENV:ComputerName"}
}
catch
{
Write-Output "ERROR: $_"
}
finally
{
if ($session)
{
Remove-PSSession $session
}
}
संदर्भ: [१] https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/new-pssession