PowerShell
Powershell Remoting
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