Vanliga frågor och svar om PowerShell-fjärrkommunikation

När du arbetar via fjärranslutning skriver du kommandon i PowerShell på en dator (kallas "lokal dator"), men kommandona körs på en annan dator (kallas "fjärrdatorn"). Upplevelsen av att arbeta på distans bör vara så mycket som att arbeta direkt på fjärrdatorn som möjligt.

Kommentar

Om du vill använda PowerShell-fjärrkommunikation måste fjärrdatorn konfigureras för fjärrkommunikation. Mer information finns i about_Remote_Requirements.

Måste båda datorerna ha PowerShell installerat?

Ja. För att kunna arbeta via fjärranslutning måste de lokala datorerna och fjärrdatorerna ha PowerShell, Microsoft .NET Framework och WS-Management-protokollet (Web Services for Management). Alla filer och andra resurser som behövs för att köra ett visst kommando måste finnas på fjärrdatorn.

Datorer som kör Windows PowerShell 3.0 och datorer som kör Windows PowerShell 2.0 kan fjärransluta till varandra och köra fjärrkommandon. Vissa funktioner, till exempel möjligheten att koppla från en session och återansluta till den, fungerar dock bara när båda datorerna kör Windows PowerShell 3.0.

Du måste ha behörighet att ansluta till fjärrdatorn, behörighet att köra PowerShell och behörighet att komma åt datalager (till exempel filer och mappar) och registret på fjärrdatorn.

Mer information finns i about_Remote_Requirements.

Hur fungerar fjärrkommunikation?

När du skickar ett fjärrkommando överförs kommandot över nätverket till PowerShell-motorn på fjärrdatorn och körs i PowerShell-klienten på fjärrdatorn. Kommandoresultatet skickas tillbaka till den lokala datorn och visas i PowerShell-sessionen på den lokala datorn.

För att överföra kommandona och ta emot utdata använder PowerShell WS-Management-protokollet. Information om WS-Management-protokollet finns i WS-Management Protocol i Windows-dokumentationen.

Från och med Windows PowerShell 3.0 lagras fjärrsessioner på fjärrdatorn. På så sätt kan du koppla från sessionen och återansluta från en annan session eller en annan dator utan att avbryta kommandona eller förlora tillståndet.

Är PowerShell-fjärrkommunikation säkert?

När du ansluter till en fjärrdator använder systemet autentiseringsuppgifterna för användarnamn och lösenord på den lokala datorn eller de autentiseringsuppgifter som du anger i kommandot för att logga in på fjärrdatorn. Autentiseringsuppgifterna och resten av överföringen krypteras.

Om du vill lägga till ytterligare skydd kan du konfigurera fjärrdatorn så att den använder Secure Sockets Layer (SSL) i stället för HTTP för att lyssna efter WinRM-begäranden (Windows Remote Management). Sedan kan användarna använda parametern UseSSL för Invoke-Commandcmdletarna , New-PSSessionoch Enter-PSSession när de upprättar en anslutning. Det här alternativet använder den säkrare HTTPS-kanalen i stället för HTTP.

Kräver alla fjärrkommandon PowerShell-fjärrkommunikation?

Nej. Vissa cmdletar har en Parameter för ComputerName som gör att du kan hämta objekt från fjärrdatorn.

Dessa cmdletar använder inte PowerShell-fjärrkommunikation. Du kan därför använda dem på alla datorer som kör PowerShell, även om datorn inte är konfigurerad för PowerShell-fjärrkommunikation eller om datorn inte uppfyller kraven för PowerShell-fjärrkommunikation.

Dessa cmdletar innehåller följande:

  • Get-Hotfix
  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

Om du vill hitta alla cmdletar med parametern ComputerName skriver du:

Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName

Information om huruvida parametern ComputerName för en viss cmdlet kräver PowerShell-fjärrkommunikation finns i parameterbeskrivningen. Om du vill visa parameterbeskrivningen skriver du:

Get-Help <cmdlet-name> -Parameter ComputerName

Till exempel:

Get-Help Get-Hotfix -Parameter ComputerName

Använd cmdleten för Invoke-Command alla andra kommandon.

Hur gör jag för att köra ett kommando på en fjärrdator?

Om du vill köra ett kommando på en fjärrdator använder du cmdleten Invoke-Command .

Omslut kommandot i klammerparenteser ({}) för att göra det till ett skriptblock. Använd parametern Invoke-Command ScriptBlock för för att ange kommandot.

Du kan använda parametern Invoke-Command ComputerName för för att ange en fjärrdator. Eller så kan du skapa en beständig anslutning till en fjärrdator (en session) och sedan använda sessionsparameternInvoke-Command för för att köra kommandot i sessionen.

Följande kommandon kör till exempel ett Get-Process kommando via fjärranslutning.

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}

#  - OR -

Invoke-Command -Session $s -ScriptBlock {Get-Process}

Om du vill avbryta ett fjärrkommando skriver du CTRL+C. Avbrottsbegäran skickas till fjärrdatorn, där fjärrkommandot avslutas.

Mer information om fjärrkommandon finns i about_Remote och hjälpavsnitten för cmdletar som stöder fjärrkommunikation.

Kan jag bara telnet till en fjärrdator?

Du kan använda cmdleten Enter-PSSession för att starta en interaktiv session med en fjärrdator.

I PowerShell-prompten skriver du:

Enter-PSSession <ComputerName>

Kommandotolken ändras för att visa att du är ansluten till fjärrdatorn.

<ComputerName>\C:>

Nu körs de kommandon som du skriver på fjärrdatorn precis som om du skrev dem direkt på fjärrdatorn.

Om du vill avsluta den interaktiva sessionen skriver du:

Exit-PSSession

En interaktiv session är en beständig session som använder WS-Management-protokollet. Det är inte samma sak som att använda Telnet, men det ger en liknande upplevelse.

Mer information finns i Enter-PSSession.

Kan jag skapa en beständig anslutning?

Ja. Du kan köra fjärrkommandon genom att ange namnet på fjärrdatorn, dess NetBIOS-namn eller dess IP-adress. Du kan också köra fjärrkommandon genom att ange en PowerShell-session (PSSession) som är ansluten till fjärrdatorn.

När du använder parametern ComputerName för Invoke-Command eller Enter-PSSessionupprättar PowerShell en tillfällig anslutning. PowerShell använder anslutningen för att bara köra det aktuella kommandot och stänger sedan anslutningen. Det här är en mycket effektiv metod för att köra ett enda kommando eller flera orelaterade kommandon, även på många fjärrdatorer.

När du använder cmdleten New-PSSession för att skapa en PSSession upprättar PowerShell en beständig anslutning för PSSession. Sedan kan du köra flera kommandon i PSSession, inklusive kommandon som delar data.

Vanligtvis skapar du en PSSession för att köra en serie relaterade kommandon som delar data. Annars räcker den tillfälliga anslutning som skapas av parametern ComputerName för de flesta kommandon.

Mer information om sessioner finns i about_PSSessions.

Kan jag köra kommandon på fler än en dator i taget?

Ja. Parametern ComputerName i cmdleten Invoke-Command accepterar flera datornamn och parametern Session accepterar flera PSSessioner.

När du kör ett Invoke-Command kommando kör PowerShell kommandona på alla angivna datorer eller i alla angivna PSSessioner.

PowerShell kan hantera hundratals samtidiga fjärranslutningar. Antalet fjärrkommandon som du kan skicka kan dock begränsas av datorns resurser och dess kapacitet att upprätta och underhålla flera nätverksanslutningar.

Mer information finns i exemplet i hjälpavsnittet Invoke-Command .

Var finns mina profiler?

PowerShell-profiler körs inte automatiskt i fjärrsessioner, så kommandona som profilen lägger till finns inte i sessionen. Dessutom fylls inte den $profile automatiska variabeln i i fjärrsessioner.

Om du vill köra en profil i en session använder du cmdleten Invoke-Command .

Följande kommando kör till exempel CurrentUserCurrentHost-profilen från den lokala datorn i sessionen i $s.

Invoke-Command -Session $s -FilePath $profile

Följande kommando kör CurrentUserCurrentHost-profilen från fjärrdatorn i sessionen i $s. Eftersom variabeln $profile inte är ifylld använder kommandot den explicita sökvägen till profilen.

Invoke-Command -Session $s {
  . "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}

När du har kört det här kommandot är de kommandon som profilen lägger till i sessionen tillgängliga i $s.

Du kan också använda ett startskript i en sessionskonfiguration för att köra en profil i varje fjärrsession som använder sessionskonfigurationen.

Mer information om PowerShell-profiler finns i about_Profiles. Mer information om sessionskonfigurationer finns i Register-PSSessionConfiguration.

Hur fungerar begränsning på fjärrkommandon?

För att hjälpa dig att hantera resurserna på den lokala datorn innehåller PowerShell en begränsningsfunktion per kommando som gör att du kan begränsa antalet samtidiga fjärranslutningar som upprättas för varje kommando.

Standardvärdet är 32 samtidiga anslutningar, men du kan använda parametern ThrottleLimit för cmdletarna för att ange en anpassad begränsningsgräns för vissa kommandon.

När du använder begränsningsfunktionen ska du komma ihåg att den tillämpas på varje kommando, inte på hela sessionen eller på datorn. Om du kör kommandon samtidigt i flera sessioner eller PSSessioner är antalet samtidiga anslutningar summan av de samtidiga anslutningarna i alla sessioner.

Om du vill hitta cmdletar med parametern ThrottleLimit skriver du:

Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit

Skiljer sig utdata från fjärrkommandon från lokala utdata?

När du använder PowerShell lokalt skickar och tar du emot "live" .NET Framework-objekt. "live"-objekt är objekt som är associerade med faktiska program eller systemkomponenter. När du anropar metoderna eller ändrar egenskaperna för levande objekt påverkar ändringarna det faktiska programmet eller komponenten. Och när egenskaperna för ett program eller en komponent ändras ändras även egenskaperna för det objekt som representerar dem.

Men eftersom de flesta levande objekt inte kan överföras via nätverket " serialiserar" PowerShell de flesta objekt som skickas i fjärrkommandon, det vill ex. det konverterar varje objekt till en serie XML-dataelement (Begränsningsspråk i XML [CLiXML]) för överföring.

När PowerShell tar emot ett serialiserat objekt konverteras XML till en deserialiserad objekttyp. Det deserialiserade objektet är en korrekt post av egenskaperna för programmet eller komponenten vid en tidigare tidpunkt, men det är inte längre "live", dvs. det är inte längre direkt associerat med komponenten. Och metoderna tas bort eftersom de inte längre är effektiva.

Vanligtvis kan du använda deserialiserade objekt precis som du skulle använda levande objekt, men du måste vara medveten om deras begränsningar. Dessutom har de objekt som returneras av cmdleten Invoke-Command ytterligare egenskaper som hjälper dig att fastställa kommandots ursprung.

Vissa objekttyper, till exempel DirectoryInfo-objekt och GUID:er, konverteras tillbaka till levande objekt när de tas emot. Dessa objekt behöver ingen särskild hantering eller formatering.

Information om hur du tolkar och formaterar fjärrutdata finns i about_Remote_Output.

Kan jag fjärrköra bakgrundsjobb?

Ja. Ett PowerShell-bakgrundsjobb är ett PowerShell-kommando som körs asynkront utan att interagera med sessionen. När du startar ett bakgrundsjobb returnerar kommandotolken omedelbart och du kan fortsätta att arbeta i sessionen medan jobbet körs även om det körs under en längre tid.

Du kan starta ett bakgrundsjobb även om andra kommandon körs eftersom bakgrundsjobb alltid körs asynkront i en tillfällig session.

Du kan köra bakgrundsjobb på en lokal eller fjärransluten dator. Som standard körs ett bakgrundsjobb på den lokala datorn. Du kan dock använda asjob-parametern för cmdleten Invoke-Command för att köra alla fjärrkommandon som ett bakgrundsjobb. Och du kan använda Invoke-Command för att köra ett Start-Job kommando via fjärranslutning.

Mer information om bakgrundsjobb i PowerShell finns i about_Jobs och about_Remote_Jobs.

Kan jag köra Windows-program på en fjärrdator?

Du kan använda PowerShell-fjärrkommandon för att köra Windows-baserade program på fjärrdatorer. Du kan till exempel köra Shutdown.exe eller Ipconfig.exe på en fjärrdator.

Du kan dock inte använda PowerShell-kommandon för att öppna användargränssnittet för något program på en fjärrdator.

När du startar ett Windows-program på en fjärrdator slutförs inte kommandot och PowerShell-kommandotolken returneras inte förrän programmet är klart eller tills du trycker på CTRL+C för att avbryta kommandot. Om du till exempel kör Ipconfig.exe programmet på en fjärrdator returneras inte kommandotolken förrän Ipconfig.exe den har slutförts.

Om du använder fjärrkommandon för att starta ett program som har ett användargränssnitt startar programprocessen, men användargränssnittet visas inte. PowerShell-kommandot har inte slutförts och kommandotolken returneras inte förrän du stoppar programprocessen eller tills du trycker på CTRL+C, vilket avbryter kommandot och stoppar processen.

Om du till exempel använder ett PowerShell-kommando för att köra Notepad på en fjärrdator startar Anteckningar processen på fjärrdatorn, men Anteckningar användargränssnittet visas inte. Tryck på CTRL+C om du vill avbryta kommandot och återställa kommandotolken.

Kan jag begränsa de kommandon som användare kan köra via fjärranslutning på min dator?

Ja. Varje fjärrsession måste använda någon av sessionskonfigurationerna på fjärrdatorn. Du kan hantera sessionskonfigurationerna på datorn (och behörigheterna till dessa sessionskonfigurationer) för att avgöra vem som kan köra kommandon via fjärranslutning på datorn och vilka kommandon de kan köra.

En sessionskonfiguration konfigurerar miljön för sessionen. Du kan definiera konfigurationen med hjälp av en sammansättning som implementerar en ny konfigurationsklass eller med hjälp av ett skript som körs i sessionen. Konfigurationen kan fastställa vilka kommandon som är tillgängliga i sessionen. Och konfigurationen kan innehålla inställningar som skyddar datorn, till exempel inställningar som begränsar mängden data som sessionen kan ta emot via fjärranslutning i ett enda objekt eller kommando. Du kan också ange en säkerhetsbeskrivning som avgör vilka behörigheter som krävs för att använda konfigurationen.

Cmdleten Enable-PSRemoting skapar standardkonfigurationerna för sessioner på datorn: Microsoft.PowerShell, Microsoft.PowerShell.Workflow och Microsoft.PowerShell32 (endast 64-bitars operativsystem). Enable-PSRemoting anger säkerhetsbeskrivningen för konfigurationen så att endast medlemmar i gruppen Administratörer på datorn kan använda dem.

Du kan använda cmdletar för sessionskonfiguration för att redigera standardkonfigurationerna för sessioner, skapa nya sessionskonfigurationer och ändra säkerhetsbeskrivningarna för alla sessionskonfigurationer.

Från och med Windows PowerShell 3.0 kan du med cmdleten New-PSSessionConfigurationFile skapa anpassade sessionskonfigurationer med hjälp av en textfil. Filen innehåller alternativ för att ange språkläge och för att ange de cmdletar och moduler som är tillgängliga i sessioner som använder sessionskonfigurationen.

När användarna använder Invoke-Commandcmdletarna , New-PSSessioneller Enter-PSSession kan de använda parametern ConfigurationName för att ange sessionskonfigurationen som används för sessionen. Och de kan ändra standardkonfigurationen som deras sessioner använder genom att ändra värdet för $PSSessionConfigurationName inställningsvariabeln i sessionen.

Mer information om sessionskonfigurationer finns i Hjälp för cmdletar för sessionskonfiguration. Om du vill hitta cmdletarna för sessionskonfiguration skriver du:

Get-Command *PSSessionConfiguration

Vad är konfigurationer för in- och ut fläktar?

Det vanligaste PowerShell-fjärrkommunikationsscenariot med flera datorer är en-till-många-konfigurationen, där en lokal dator (administratörens dator) kör PowerShell-kommandon på flera fjärrdatorer. Detta kallas för "fan-out"-scenariot.

I vissa företag är dock konfigurationen många-till-en, där många klientdatorer ansluter till en enda fjärrdator som kör PowerShell, till exempel en filserver eller en helskärmsläge. Detta kallas för "fan-in"-konfigurationen.

PowerShell-fjärrkommunikation har stöd för både konfigurationer av utrullningsbara och inaktiva fläktar.

PowerShell använder protokollet Web Services for Management (WS-Management) och WinRM-tjänsten som har stöd för Microsoft-implementeringen av WS-Management för uttömningskonfigurationen. När en lokal dator ansluter till en fjärrdator upprättar WS-Management en anslutning och använder ett plugin-program för PowerShell för att starta PowerShell-värdprocessen (Wsmprovhost.exe) på fjärrdatorn. Användaren kan ange en alternativ port, en alternativ sessionskonfiguration och andra funktioner för att anpassa fjärranslutningen.

För att stödja konfigurationen "fan-in" använder PowerShell IIS (Internet Information Services) som värd för WS-Management, för att läsa in PowerShell-plugin-programmet och starta PowerShell. I det här scenariot körs alla PowerShell-sessioner i samma värdprocess i stället för att starta varje PowerShell-session i en separat process.

IIS-värdtjänster och fjärrhantering med fläkt stöds inte i Windows XP eller Windows Server 2003.

I en inaktiv konfiguration kan användaren ange en anslutnings-URI och en HTTP-slutpunkt, inklusive transport, datornamn, port och programnamn. IIS vidarebefordrar alla begäranden med ett angivet programnamn till programmet. Standardvärdet är WS-Management, som kan vara värd för PowerShell.

Du kan också ange en autentiseringsmekanism och förbjuda eller tillåta omdirigering från HTTP- och HTTPS-slutpunkter.

Kan jag testa fjärrkommunikation på en enda dator som inte finns i en domän?

Ja. PowerShell-fjärrkommunikation är tillgängligt även om den lokala datorn inte finns i en domän. Du kan använda fjärrkommunikationsfunktionerna för att ansluta till sessioner och skapa sessioner på samma dator. Funktionerna fungerar på samma sätt som när du ansluter till en fjärrdator.

Om du vill köra fjärrkommandon på en dator i en arbetsgrupp ändrar du följande Windows-inställningar på datorn.

Varning! De här inställningarna påverkar alla användare i systemet och de kan göra systemet mer sårbart för skadliga attacker. Var försiktig när du gör dessa ändringar.

  • Windows Vista, Windows 7, Windows 8:

    Skapa följande registerpost och ange dess värde till 1: LocalAccountTokenFilterPolicy i HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    Du kan använda följande PowerShell-kommando för att lägga till den här posten:

    $parameters = @{
      Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
      Name='LocalAccountTokenFilterPolicy'
      propertyType='DWord'
      Value=1
    }
    New-ItemProperty @parameters
    
  • Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2012 R2:

    Inga ändringar krävs eftersom standardinställningen för principen "Nätverksåtkomst: Delning och säkerhetsmodell för lokala konton" är "Klassisk". Kontrollera inställningen om den har ändrats.

Kan jag köra fjärrkommandon på en dator i en annan domän?

Ja. Normalt körs kommandona utan fel, även om du kan behöva använda parametern Invoke-CommandCredential i cmdletarna , New-PSSessioneller Enter-PSSession för att ange autentiseringsuppgifterna för en medlem i gruppen Administratörer på fjärrdatorn. Detta krävs ibland även när den aktuella användaren är medlem i gruppen Administratörer på lokala datorer och fjärrdatorer.

Men om fjärrdatorn inte finns i en domän som den lokala datorn litar på kanske fjärrdatorn inte kan autentisera användarens autentiseringsuppgifter.

Om du vill aktivera autentisering använder du följande kommando för att lägga till fjärrdatorn i listan över betrodda värdar för den lokala datorn i WinRM. Skriv kommandot i PowerShell-prompten.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>

Om du till exempel vill lägga till Server01-datorn i listan över betrodda värdar på den lokala datorn skriver du följande kommando i PowerShell-prompten:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01

Stöder PowerShell fjärrkommunikation via SSH?

Ja. Mer information finns i PowerShell-fjärrkommunikation via SSH.