खोज…


टिप्पणियों

पॉवरशेल रेमोटिंग को सक्षम करना

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



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow