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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow