Zoeken…


Opmerkingen

PowerShell Remoting inschakelen

PowerShell-remoting moet eerst worden ingeschakeld op de server waarmee u op afstand verbinding wilt maken.

Enable-PSRemoting -Force

Deze opdracht doet het volgende:

  • Voert de cmdlet Set-WSManQuickConfig uit, die de volgende taken uitvoert:
  • Start de WinRM-service.
  • Stelt het opstarttype op de WinRM-service in op Automatisch.
  • Maakt een luisteraar om verzoeken op elk IP-adres te accepteren, als dit nog niet bestaat.
  • Maakt een firewall-uitzondering mogelijk voor WS-Management-communicatie.
  • Registreert de Microsoft.PowerShell en Microsoft.PowerShell.Workflow sessieconfiguraties, als deze nog niet zijn geregistreerd.
  • Registreert de Microsoft.PowerShell32-sessieconfiguratie op 64-bits computers, als deze nog niet is geregistreerd.
  • Schakelt alle sessieconfiguraties in.
  • Wijzigt de beveiligingsdescriptor van alle sessieconfiguraties om externe toegang toe te staan.
  • Start de WinRM-service opnieuw om de voorgaande wijzigingen van kracht te laten worden.

Alleen voor niet-domeinomgevingen

Voor servers in een AD-domein gebeurt de PS-verificatie via Kerberos ('Standaard') of NTLM ('Onderhandelen'). Als u remoting naar een niet-domeinserver wilt toestaan, hebt u twee opties.

Stel WSMan-communicatie in via HTTPS (waarvoor het genereren van certificaten vereist) of schakel basisverificatie in die uw referenties via de wire base64-gecodeerd verzendt (dat is in principe hetzelfde als gewone tekst, dus wees hier voorzichtig mee).

In beide gevallen moet u de externe systemen toevoegen aan uw lijst met vertrouwde hosts van WSMan.

Basisverificatie inschakelen

Set-Item WSMan:\localhost\Service\AllowUnencrypted $true  

Dan op de computer die u wilt aansluiten uit, moet je zeggen tot de computer die u aansluit op vertrouwen.

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 *

Belangrijk : u moet uw client vertellen om de geadresseerde computer te vertrouwen op de manier waarop u verbinding wilt maken (als u bijvoorbeeld verbinding maakt via IP, moet deze de IP vertrouwen en niet de hostnaam)

Verbinding maken met een externe server via PowerShell

Inloggegevens van uw lokale computer gebruiken:

Enter-PSSession 192.168.1.1

Vragen om referenties op de externe computer

Enter-PSSession 192.168.1.1 -Credential $(Get-Credential)

Voer opdrachten uit op een externe computer

Zodra Powershell-remoting is ingeschakeld (Enable-PSRemoting) U kunt opdrachten op de externe computer als volgt uitvoeren:

Invoke-Command -ComputerName "RemoteComputerName" -ScriptBlock {
    Write host "Remote Computer Name: $ENV:ComputerName"
}

De bovenstaande methode maakt een tijdelijke sessie en sluit deze direct nadat het commando of scriptblok is beëindigd.

Om de sessie open te laten en er later een andere opdracht in uit te voeren, moet u eerst een externe sessie maken:

$Session = New-PSSession -ComputerName "RemoteComputerName"

Vervolgens kunt u deze sessie gebruiken telkens wanneer u opdrachten op de externe computer oproept:

Invoke-Command -Session $Session -ScriptBlock {
    Write host "Remote Computer Name: $ENV:ComputerName"
}

Invoke-Command -Session $Session -ScriptBlock {
    Get-Date
}

Als u verschillende referenties moet gebruiken, kunt u deze toevoegen met de parameter -Credential :

$Cred = Get-Credential
Invoke-Command -Session $Session -Credential $Cred -ScriptBlock {...}

Waarschuwing voor serialisatie op afstand

Notitie:

Het is belangrijk om te weten dat remoting PowerShell-objecten op het externe systeem serialiseert en deserialiseert aan het einde van de remoting-sessie, dat wil zeggen dat ze tijdens het transport naar XML worden geconverteerd en al hun methoden verliezen.

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

Terwijl je de methoden op het reguliere PS-object hebt:

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)

Gebruik van argumenten

Als u argumenten als parameters voor het externe scriptblok wilt gebruiken, kunt u de parameter ArgumentList van Invoke-Command gebruiken of de syntaxis $Using: .

ArgumentList met naamloze parameters (dwz in de volgorde waarin ze aan het scriptblok worden doorgegeven):

$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 met benoemde parameters:

$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: syntaxis:

$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ScriptBlock {
    Get-Service $Using:servicesToShow
    Remove-Item -Path $fileName -ErrorAction SilentlyContinue -Force
}

Een best practice voor het automatisch opschonen van PSSessions

Wanneer een externe sessie wordt gemaakt via de cmdlet New-PSsession , blijft de PSSession bestaan totdat de huidige PowerShell-sessie eindigt. Dit betekent dat standaard de PSSession en alle bijbehorende bronnen zullen worden gebruikt totdat de huidige PowerShell-sessie eindigt.

Meerdere actieve PSSessions kunnen een belasting van bronnen worden, met name voor langlopende of onderling verbonden scripts die honderden PSSessions in één PowerShell-sessie creëren.

Het is best om elke PSSession na het gebruik expliciet te verwijderen. [1]

De volgende codesjabloon gebruikt try-catch-finally om het bovenstaande te bereiken, waarbij foutafhandeling wordt gecombineerd met een veilige manier om ervoor te zorgen dat alle gemaakte PSSessions worden verwijderd wanneer ze klaar zijn met gebruiken:

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

Referenties: [1] 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow