Veelgestelde vragen over externe PowerShell-communicatie

Wanneer u op afstand werkt, typt u opdrachten in PowerShell op één computer (ook wel de 'lokale computer' genoemd), maar de opdrachten worden uitgevoerd op een andere computer (ook wel de 'externe computer' genoemd). De ervaring van werken op afstand moet zo veel mogelijk zijn als werken rechtstreeks op de externe computer.

Notitie

Als u externe communicatie met PowerShell wilt gebruiken, moet de externe computer worden geconfigureerd voor externe communicatie. Zie about_Remote_Requirements voor meer informatie.

Moet PowerShell op beide computers zijn geïnstalleerd?

Ja. Als u op afstand wilt werken, moeten de lokale en externe computers Beschikken over PowerShell, het Microsoft .NET Framework en het WS-beheerprotocol (Web Services for Management). Bestanden en andere resources die nodig zijn om een bepaalde opdracht uit te voeren, moeten zich op de externe computer bevinden.

Computers met Windows PowerShell 3.0 en computers met Windows PowerShell 2.0 kunnen op afstand verbinding maken met elkaar en externe opdrachten uitvoeren. Sommige functies, zoals de mogelijkheid om de verbinding met een sessie te verbreken en opnieuw verbinding te maken, werken echter alleen wanneer op beide computers Windows PowerShell 3.0 wordt uitgevoerd.

U moet gemachtigd zijn om verbinding te maken met de externe computer, om PowerShell uit te voeren en om toegang te krijgen tot gegevensarchieven (zoals bestanden en mappen) en het register op de externe computer.

Zie about_Remote_Requirements voor meer informatie.

Hoe werkt externe communicatie?

Wanneer u een externe opdracht verzendt, wordt de opdracht via het netwerk verzonden naar de PowerShell-engine op de externe computer en wordt deze uitgevoerd in de PowerShell-client op de externe computer. De opdrachtresultaten worden teruggestuurd naar de lokale computer en worden weergegeven in de PowerShell-sessie op de lokale computer.

PowerShell gebruikt het WS-Management-protocol om de opdrachten te verzenden en de uitvoer te ontvangen. Zie WS-Management Protocol in de Windows-documentatie voor meer informatie over het WS-Management-protocol .

Vanaf Windows PowerShell 3.0 worden externe sessies opgeslagen op de externe computer. Hierdoor kunt u de verbinding met de sessie verbreken en opnieuw verbinding maken met een andere sessie of een andere computer zonder de opdrachten te onderbreken of de status te verliezen.

Is externe communicatie van PowerShell veilig?

Wanneer u verbinding maakt met een externe computer, gebruikt het systeem de gebruikersnaam en wachtwoordreferenties op de lokale computer of de referenties die u in de opdracht opgeeft om u aan te melden bij de externe computer. De referenties en de rest van de overdracht worden versleuteld.

Als u extra beveiliging wilt toevoegen, kunt u de externe computer configureren voor het gebruik van Secure Sockets Layer (SSL) in plaats van HTTP om te luisteren naar WinRM-aanvragen (Windows Remote Management). Vervolgens kunnen gebruikers de UseSSL-parameter van de Invoke-Command, New-PSSessionen Enter-PSSession cmdlets gebruiken bij het tot stand brengen van een verbinding. Deze optie maakt gebruik van het veiligere HTTPS-kanaal in plaats van HTTP.

Vereisen alle externe opdrachten externe communicatie van PowerShell?

Nee Sommige cmdlets hebben een ComputerName-parameter waarmee u objecten van de externe computer kunt ophalen.

Deze cmdlets maken geen gebruik van externe communicatie van PowerShell. U kunt ze dus gebruiken op elke computer waarop PowerShell wordt uitgevoerd, zelfs als de computer niet is geconfigureerd voor externe communicatie met PowerShell of als de computer niet voldoet aan de vereisten voor externe communicatie met PowerShell.

Deze cmdlets omvatten het volgende:

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

Als u alle cmdlets met een computernaamparameter wilt zoeken, typt u:

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

Als u wilt bepalen of voor de parameter ComputerName van een bepaalde cmdlet externe communicatie met PowerShell is vereist, raadpleegt u de beschrijving van de parameter. Als u de beschrijving van de parameter wilt weergeven, typt u:

Get-Help <cmdlet-name> -Parameter ComputerName

Voorbeeld:

Get-Help Get-Hotfix -Parameter ComputerName

Gebruik de Invoke-Command cmdlet voor alle andere opdrachten.

Hoe kan ik een opdracht uitvoeren op een externe computer?

Gebruik de Invoke-Command cmdlet om een opdracht uit te voeren op een externe computer.

Plaats de opdracht tussen accolades ({}) om er een scriptblok van te maken. Gebruik de parameter ScriptBlock om Invoke-Command de opdracht op te geven.

U kunt de parameter Invoke-Command ComputerName gebruiken om een externe computer op te geven. U kunt ook een permanente verbinding maken met een externe computer (een sessie) en vervolgens de sessieparameter gebruiken om Invoke-Command de opdracht in de sessie uit te voeren.

Met de volgende opdrachten wordt bijvoorbeeld een Get-Process opdracht op afstand uitgevoerd.

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

#  - OR -

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

Als u een externe opdracht wilt onderbreken, typt u Ctrl C+. De onderbrekingsaanvraag wordt doorgegeven aan de externe computer, waarbij de externe opdracht wordt beëindigd.

Zie about_Remote en de Help-onderwerpen voor de cmdlets die externe communicatie ondersteunen voor meer informatie over externe opdrachten.

Kan ik gewoon telnet gebruiken op een externe computer?

U kunt de Enter-PSSession cmdlet gebruiken om een interactieve sessie te starten met een externe computer.

Typ bij de PowerShell-prompt:

Enter-PSSession <ComputerName>

De opdrachtprompt verandert om aan te geven dat u bent verbonden met de externe computer.

<ComputerName>\C:>

Nu worden de opdrachten die u typt, uitgevoerd op de externe computer, net alsof u ze rechtstreeks op de externe computer hebt getypt.

Als u de interactieve sessie wilt beëindigen, typt u:

Exit-PSSession

Een interactieve sessie is een permanente sessie die gebruikmaakt van het WS-Management-protocol. Het is niet hetzelfde als het gebruik van Telnet, maar biedt een vergelijkbare ervaring.

Zie Enter-PSSession voor meer informatie.

Kan ik een permanente verbinding maken?

Ja. U kunt externe opdrachten uitvoeren door de naam van de externe computer, de NetBIOS-naam of het BIJBEHORENDE IP-adres op te geven. U kunt ook externe opdrachten uitvoeren door een PowerShell-sessie (PSSession) op te geven die is verbonden met de externe computer.

Wanneer u de parameter ComputerName van Invoke-Command of Enter-PSSessiongebruikt, wordt in PowerShell een tijdelijke verbinding tot stand gebracht. PowerShell maakt gebruik van de verbinding om alleen de huidige opdracht uit te voeren en sluit vervolgens de verbinding. Dit is een zeer efficiënte methode voor het uitvoeren van één opdracht of meerdere niet-gerelateerde opdrachten, zelfs op veel externe computers.

Wanneer u de New-PSSession cmdlet gebruikt om een PSSession te maken, maakt PowerShell een permanente verbinding voor de PSSession. Vervolgens kunt u meerdere opdrachten uitvoeren in de PSSession, inclusief opdrachten die gegevens delen.

Normaal gesproken maakt u een PSSession om een reeks gerelateerde opdrachten uit te voeren die gegevens delen. Anders is de tijdelijke verbinding die is gemaakt door de parameter ComputerName voldoende voor de meeste opdrachten.

Zie about_PSSessions voor meer informatie over sessies.

Kan ik opdrachten uitvoeren op meer dan één computer tegelijk?

Ja. De parameter ComputerName van de Invoke-Command cmdlet accepteert meerdere computernamen en de sessieparameter accepteert meerdere PSSessions.

Wanneer u een Invoke-Command opdracht uitvoert, worden de opdrachten uitgevoerd op alle opgegeven computers of in alle opgegeven PSSessions.

PowerShell kan honderden gelijktijdige externe verbindingen beheren. Het aantal externe opdrachten dat u kunt verzenden, kan echter worden beperkt door de resources van uw computer en de capaciteit om meerdere netwerkverbindingen tot stand te brengen en te onderhouden.

Zie het voorbeeld in het Invoke-Command Help-onderwerp voor meer informatie.

Waar zijn mijn profielen?

PowerShell-profielen worden niet automatisch uitgevoerd in externe sessies, dus de opdrachten die het profiel toevoegt, zijn niet aanwezig in de sessie. Bovendien wordt de $profile automatische variabele niet ingevuld in externe sessies.

Gebruik de Invoke-Command cmdlet om een profiel in een sessie uit te voeren.

Met de volgende opdracht wordt bijvoorbeeld het CurrentUserCurrentHost-profiel uitgevoerd vanaf de lokale computer in de sessie in $s.

Invoke-Command -Session $s -FilePath $profile

Met de volgende opdracht wordt het CurrentUserCurrentHost-profiel uitgevoerd vanaf de externe computer in de sessie in $s. Omdat de $profile variabele niet is ingevuld, gebruikt de opdracht het expliciete pad naar het profiel.

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

Nadat u deze opdracht hebt uitgevoerd, zijn de opdrachten die het profiel toevoegt aan de sessie beschikbaar in $s.

U kunt ook een opstartscript in een sessieconfiguratie gebruiken om een profiel uit te voeren in elke externe sessie die gebruikmaakt van de sessieconfiguratie.

Zie about_Profiles voor meer informatie over PowerShell-profielen. Zie voor meer informatie over sessieconfiguraties Register-PSSessionConfiguration.

Hoe werkt beperking voor externe opdrachten?

Om u te helpen bij het beheren van de resources op uw lokale computer, bevat PowerShell een beperkingsfunctie per opdracht waarmee u het aantal gelijktijdige externe verbindingen kunt beperken dat voor elke opdracht tot stand is gebracht.

De standaardwaarde is 32 gelijktijdige verbindingen, maar u kunt de parameter ThrottleLimit van de cmdlets gebruiken om een aangepaste beperkingslimiet in te stellen voor bepaalde opdrachten.

Wanneer u de beperkingsfunctie gebruikt, moet u er rekening mee houden dat deze wordt toegepast op elke opdracht, niet op de hele sessie of op de computer. Als u gelijktijdig opdrachten uitvoert in verschillende sessies of PSSessions, is het aantal gelijktijdige verbindingen de som van de gelijktijdige verbindingen in alle sessies.

Als u cmdlets wilt zoeken met een parameter ThrottleLimit , typt u:

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

Verschilt de uitvoer van externe opdrachten van lokale uitvoer?

Wanneer u PowerShell lokaal gebruikt, verzendt en ontvangt u live .NET Framework-objecten; 'live'-objecten zijn objecten die zijn gekoppeld aan werkelijke programma's of systeemonderdelen. Wanneer u de methoden aanroept of de eigenschappen van live-objecten wijzigt, zijn de wijzigingen van invloed op het werkelijke programma of onderdeel. En wanneer de eigenschappen van een programma of onderdeel worden gewijzigd, veranderen de eigenschappen van het object dat ze vertegenwoordigen ook.

Omdat de meeste live-objecten echter niet via het netwerk kunnen worden verzonden, serialiseert PowerShell de meeste objecten die in externe opdrachten worden verzonden, dat wil gezegd, elk object converteert naar een reeks XML-gegevenselementen (Constraint Language in XML [CLiXML]) voor verzending.

Wanneer PowerShell een geserialiseerd object ontvangt, wordt de XML geconverteerd naar een gedeserialiseerd objecttype. Het gedeserialiseerde object is een nauwkeurige record van de eigenschappen van het programma of onderdeel op een eerder tijdstip, maar het is niet langer "live", dat wil gezegd, het is niet meer rechtstreeks gekoppeld aan het onderdeel. En de methoden worden verwijderd omdat ze niet meer effectief zijn.

Normaal gesproken kunt u gedeserialiseerde objecten gebruiken, net zoals u live-objecten zou gebruiken, maar u moet rekening houden met hun beperkingen. De objecten die door de Invoke-Command cmdlet worden geretourneerd, hebben ook aanvullende eigenschappen waarmee u de oorsprong van de opdracht kunt bepalen.

Sommige objecttypen, zoals DirectoryInfo-objecten en GUID's, worden weer geconverteerd naar live-objecten wanneer ze worden ontvangen. Deze objecten hebben geen speciale verwerking of opmaak nodig.

Zie about_Remote_Output voor informatie over het interpreteren en opmaken van externe uitvoer.

Kan ik achtergrondtaken extern uitvoeren?

Ja. Een PowerShell-achtergrondtaak is een PowerShell-opdracht die asynchroon wordt uitgevoerd zonder interactie met de sessie. Wanneer u een achtergrondtaak start, wordt de opdrachtprompt onmiddellijk geretourneerd en kunt u in de sessie blijven werken terwijl de taak wordt uitgevoerd, zelfs als deze gedurende langere tijd wordt uitgevoerd.

U kunt een achtergrondtaak starten, zelfs terwijl andere opdrachten worden uitgevoerd, omdat achtergrondtaken altijd asynchroon worden uitgevoerd in een tijdelijke sessie.

U kunt achtergrondtaken uitvoeren op een lokale of externe computer. Standaard wordt een achtergrondtaak uitgevoerd op de lokale computer. U kunt echter de parameter AsJob van de Invoke-Command cmdlet gebruiken om een externe opdracht uit te voeren als achtergrondtaak. En u kunt een Invoke-CommandStart-Job opdracht op afstand uitvoeren.

Zie about_Jobs en about_Remote_Jobs voor meer informatie over achtergrondtaken in PowerShell.

Kan ik Windows-programma's uitvoeren op een externe computer?

U kunt externe PowerShell-opdrachten gebruiken om Windows-programma's uit te voeren op externe computers. U kunt bijvoorbeeld een externe computer uitvoeren Shutdown.exe of Ipconfig.exe op een externe computer.

U kunt echter geen PowerShell-opdrachten gebruiken om de gebruikersinterface voor elk programma op een externe computer te openen.

Wanneer u een Windows-programma start op een externe computer, wordt de opdracht niet voltooid en wordt de PowerShell-opdrachtprompt pas geretourneerd als het programma is voltooid of totdat u op Ctrl+C drukt om de opdracht te onderbreken. Als u het Ipconfig.exe programma bijvoorbeeld uitvoert op een externe computer, wordt de opdrachtprompt pas geretourneerd als Ipconfig.exe deze is voltooid.

Als u externe opdrachten gebruikt om een programma met een gebruikersinterface te starten, wordt het programmaproces gestart, maar wordt de gebruikersinterface niet weergegeven. De PowerShell-opdracht is niet voltooid en de opdrachtprompt keert pas terug totdat u het programmaproces stopt of totdat u op Ctrl+C drukt, waardoor de opdracht wordt onderbroken en het proces wordt gestopt.

Als u bijvoorbeeld een PowerShell-opdracht gebruikt om op een externe computer uit te voerenNotepad, wordt het Kladblok proces gestart op de externe computer, maar wordt de Kladblok gebruikersinterface niet weergegeven. Als u de opdracht wilt onderbreken en de opdrachtprompt wilt herstellen, drukt u op Ctrl+C.

Kan ik de opdrachten beperken die gebruikers op afstand op mijn computer kunnen uitvoeren?

Ja. Elke externe sessie moet een van de sessieconfiguraties op de externe computer gebruiken. U kunt de sessieconfiguraties op uw computer beheren (en de machtigingen voor deze sessieconfiguraties) om te bepalen wie opdrachten op afstand op uw computer kan uitvoeren en welke opdrachten ze kunnen uitvoeren.

Een sessieconfiguratie configureert de omgeving voor de sessie. U kunt de configuratie definiëren met behulp van een assembly die een nieuwe configuratieklasse implementeert of met behulp van een script dat in de sessie wordt uitgevoerd. De configuratie kan de opdrachten bepalen die beschikbaar zijn in de sessie. En de configuratie kan instellingen bevatten die de computer beveiligen, zoals instellingen die de hoeveelheid gegevens beperken die de sessie op afstand kan ontvangen in één object of opdracht. U kunt ook een beveiligingsdescriptor opgeven waarmee de machtigingen worden bepaald die nodig zijn voor het gebruik van de configuratie.

De Enable-PSRemoting cmdlet maakt de standaardsessieconfiguraties op uw computer: Microsoft.PowerShell, Microsoft.PowerShell.Workflow en Microsoft.PowerShell32 (alleen 64-bits besturingssystemen). Enable-PSRemotingstelt de beveiligingsdescriptor voor de configuratie zo in dat alleen leden van de groep Beheer istrators op uw computer deze mogen gebruiken.

U kunt de cmdlets voor sessieconfiguratie gebruiken om de standaardsessieconfiguraties te bewerken, nieuwe sessieconfiguraties te maken en de beveiligingsdescriptors van alle sessieconfiguraties te wijzigen.

Vanaf Windows PowerShell 3.0 kunt u met de New-PSSessionConfigurationFile cmdlet aangepaste sessieconfiguraties maken met behulp van een tekstbestand. Het bestand bevat opties voor het instellen van de taalmodus en voor het opgeven van de cmdlets en modules die beschikbaar zijn in sessies die gebruikmaken van de sessieconfiguratie.

Wanneer gebruikers de Invoke-Commandparameter ConfigurationName New-PSSession gebruiken, of Enter-PSSession cmdlets, kunnen ze de configuratie van de sessie aangeven die wordt gebruikt voor de sessie. En ze kunnen de standaardconfiguratie wijzigen die hun sessies gebruiken door de waarde van de $PSSessionConfigurationName voorkeursvariabele in de sessie te wijzigen.

Zie de Help voor de sessieconfiguratie-cmdlets voor meer informatie over sessieconfiguraties. Als u de cmdlets voor sessieconfiguratie wilt vinden, typt u:

Get-Command *PSSessionConfiguration

Wat zijn ventilatorconfiguraties in en uitwaaiers?

Het meest voorkomende externe PowerShell-scenario met meerdere computers is de een-op-veel-configuratie, waarbij één lokale computer (de computer van de beheerder) PowerShell-opdrachten uitvoert op tal van externe computers. Dit wordt het scenario 'fan-out' genoemd.

In sommige ondernemingen is de configuratie echter veel-op-een, waarbij veel clientcomputers verbinding maken met één externe computer waarop PowerShell wordt uitgevoerd, zoals een bestandsserver of een kiosk. Dit staat bekend als de 'fan-in'-configuratie.

Externe communicatie van PowerShell biedt ondersteuning voor zowel fan-out- als fan-in-configuraties.

Voor de fan-outconfiguratie maakt PowerShell gebruik van het WS-management-protocol (Web Services for Management) en de WinRM-service die ondersteuning biedt voor de Microsoft-implementatie van WS-Management. Wanneer een lokale computer verbinding maakt met een externe computer, brengt WS-Management een verbinding tot stand en gebruikt een invoegtoepassing voor PowerShell om het PowerShell-hostproces (Wsmprovhost.exe) op de externe computer te starten. De gebruiker kan een alternatieve poort, een alternatieve sessieconfiguratie en andere functies opgeven om de externe verbinding aan te passen.

PowerShell gebruikt internet Information Services (IIS) om WS-beheer te hosten, om de PowerShell-invoegtoepassing te laden en PowerShell te starten om de fan-inconfiguratie te ondersteunen. In dit scenario worden alle PowerShell-sessies in hetzelfde hostproces uitgevoerd in plaats van elke PowerShell-sessie in een afzonderlijk proces te starten.

IIS-hosting en fan-in extern beheer wordt niet ondersteund in Windows XP of in Windows Server 2003.

In een fan-in-configuratie kan de gebruiker een verbindings-URI en een HTTP-eindpunt opgeven, waaronder het transport, de computernaam, de poort en de toepassingsnaam. IIS stuurt alle aanvragen met een opgegeven toepassingsnaam door naar de toepassing. De standaardwaarde is WS-Management, dat PowerShell kan hosten.

U kunt ook een verificatiemechanisme opgeven en omleiding van HTTP- en HTTPS-eindpunten verbieden of toestaan.

Kan ik externe communicatie testen op één computer die zich niet in een domein bevindt?

Ja. Externe communicatie via PowerShell is beschikbaar, zelfs wanneer de lokale computer zich niet in een domein bevindt. U kunt de externe functies gebruiken om verbinding te maken met sessies en om sessies op dezelfde computer te maken. De functies werken hetzelfde als wanneer u verbinding maakt met een externe computer.

Als u externe opdrachten wilt uitvoeren op een computer in een werkgroep, wijzigt u de volgende Windows-instellingen op de computer.

Waarschuwing: deze instellingen zijn van invloed op alle gebruikers op het systeem en ze kunnen het systeem kwetsbaarder maken voor een kwaadwillende aanval. Wees voorzichtig bij het aanbrengen van deze wijzigingen.

  • Windows Vista, Windows 7, Windows 8:

    Maak de volgende registervermelding en stel vervolgens de waarde in op 1: LocalAccountTokenFilterPolicy in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    U kunt de volgende PowerShell-opdracht gebruiken om deze vermelding toe te voegen:

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

    Er zijn geen wijzigingen nodig omdat de standaardinstelling van het beleid 'Netwerktoegang: delen en beveiligingsmodel voor lokale accounts' 'Klassiek' is. Controleer of de instelling is gewijzigd voor het geval deze is gewijzigd.

Kan ik externe opdrachten uitvoeren op een computer in een ander domein?

Ja. Normaal gesproken worden de opdrachten zonder fouten uitgevoerd, hoewel u mogelijk de referentieparameter van de Invoke-Command, New-PSSessionof Enter-PSSession cmdlets moet gebruiken om de referenties op te geven van een lid van de groep Beheer istrators op de externe computer. Dit is soms vereist, zelfs wanneer de huidige gebruiker lid is van de groep Beheer istrators op de lokale en externe computers.

Als de externe computer zich echter niet in een domein bevindt dat de lokale computer vertrouwt, kan de externe computer mogelijk de referenties van de gebruiker niet verifiëren.

Als u verificatie wilt inschakelen, gebruikt u de volgende opdracht om de externe computer toe te voegen aan de lijst met vertrouwde hosts voor de lokale computer in WinRM. Typ de opdracht bij de PowerShell-prompt.

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

Als u bijvoorbeeld de Server01-computer wilt toevoegen aan de lijst met vertrouwde hosts op de lokale computer, typt u de volgende opdracht bij de PowerShell-prompt:

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

Biedt PowerShell ondersteuning voor externe communicatie via SSH?

Ja. Zie externe communicatie van PowerShell via SSH voor meer informatie.