PowerShell
Powershell Remoting
Sök…
Anmärkningar
Aktivera PowerShell Remoting
PowerShell-ombyggnad måste först vara aktiverad på den server som du vill ansluta till fjärr till.
Enable-PSRemoting -Force
Detta kommando gör följande:
- Kör Set-WSManQuickConfig cmdlet, som utför följande uppgifter:
- Startar WinRM-tjänsten.
- Ställer in starttypen på WinRM-tjänsten till Automatic.
- Skapar en lyssnare för att acceptera förfrågningar på vilken IP-adress som helst, om en inte redan finns.
- Aktiverar ett brandväggsundantag för WS-Management-kommunikation.
- Registrerar konfigurationerna av Microsoft.PowerShell och Microsoft.PowerShell.Workflow om de inte redan är registrerade.
- Registrerar Microsoft.PowerShell32-sessionskonfigurationen på 64-bitars datorer om den inte redan är registrerad.
- Aktiverar alla sessionskonfigurationer.
- Ändrar säkerhetsbeskrivningen för alla sessionskonfigurationer för att möjliggöra fjärråtkomst.
- Starta om WinRM-tjänsten för att göra föregående ändringar effektiva.
Endast för miljöer utan domäner
För servrar i en AD-domän görs PS-omstärkningsverifiering via Kerberos ('Standard') eller NTLM ('Förhandla'). Om du vill tillåta remoting till en server utan domän har du två alternativ.
Antingen konfigurera WSMan-kommunikation över HTTPS (vilket kräver certifikatgenerering) eller aktivera grundläggande autentisering som skickar dina referenser över den trådbaserade kodade kodningen (det är i princip detsamma som vanlig text, så var försiktig med det här).
I båda fallen måste du lägga till fjärrsystemen i din WSMan-lista över betrodda värdar.
Aktivera grundläggande autentisering
Set-Item WSMan:\localhost\Service\AllowUnencrypted $true
Sedan på den dator som du vill ansluta från, måste du tala om det att lita på datorn du ansluter till.
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 *
Viktigt : Du måste berätta för din klient att lita på datorn adresserad på det sätt du vill ansluta (t.ex. om du ansluter via IP måste den lita på IP: n inte värdnamnet)
Ansluter till en fjärrserver via PowerShell
Använda referenser från din lokala dator:
Enter-PSSession 192.168.1.1
Fråga om referenser på fjärrdatorn
Enter-PSSession 192.168.1.1 -Credential $(Get-Credential)
Kör kommandon på en fjärrdator
När Powershell-remoting är aktiverad (Enable-PSRemoting) Du kan köra kommandon på fjärrdatorn så här:
Invoke-Command -ComputerName "RemoteComputerName" -ScriptBlock {
Write host "Remote Computer Name: $ENV:ComputerName"
}
Ovanstående metod skapar en tillfällig session och stänger den direkt efter att kommandot eller skriptblocket är slut.
För att lämna sessionen öppen och köra andra kommandon senare, måste du först skapa en fjärrsession:
$Session = New-PSSession -ComputerName "RemoteComputerName"
Sedan kan du använda den här sessionen varje gång du anropar kommandon på fjärrdatorn:
Invoke-Command -Session $Session -ScriptBlock {
Write host "Remote Computer Name: $ENV:ComputerName"
}
Invoke-Command -Session $Session -ScriptBlock {
Get-Date
}
Om du behöver använda olika referenser kan du lägga till dem med -Credential
parametern:
$Cred = Get-Credential
Invoke-Command -Session $Session -Credential $Cred -ScriptBlock {...}
Återställning av serievarning
Notera:
Det är viktigt att veta att omstartning av PowerShell-objekt i fjärrsystemet serielliseras och deserialisering av dem i slutet av remotionssessionen, dvs. de konverteras till XML under transport och förlorar alla metoder.
$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...
Medan du har metoderna på det vanliga PS-objektet:
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)
Argumentanvändning
För att använda argument som parametrar för fjärrskriptblocket kan man antingen använda ArgumentList
parametern i Invoke-Command
eller använda $Using:
syntax.
Använda ArgumentList
med namngivna parametrar (dvs. i den ordning de skickas till skriptblock):
$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
}
Använda ArgumentList
med namngivna parametrar:
$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
}
Använda $Using:
syntax:
$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ScriptBlock {
Get-Service $Using:servicesToShow
Remove-Item -Path $fileName -ErrorAction SilentlyContinue -Force
}
En bästa praxis för automatisk rengöring av PSSessions
När en fjärrsession skapas via New-PSsession
fortsätter PSSessionen tills den aktuella PowerShell-sessionen är slut. PSSession
och alla tillhörande resurser som standard kommer att fortsätta användas tills den aktuella PowerShell-sessionen är slut.
Flera aktiva PSSessions
kan bli en påfrestning på resurser, särskilt för långa körningar eller sammanlänkade skript som skapar hundratals PSSessions
i en PowerShell-session.
Det är bästa praxis att uttryckligen ta bort varje PSSession
efter att den har använts. [1]
Följande kodmall använder try-catch-finally
för att uppnå ovanstående och kombinerar felhantering med ett säkert sätt för att säkerställa att alla skapade PSSessions
tas bort när de är färdiga att använda:
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
}
}
Referenser: [1] https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/new-pssession