Delen via


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_Requirementsvoor 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 protocol Web Services for Management (WS-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_Requirementsvoor 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 protocol WS-Management.

Vanaf Windows PowerShell 3.0 slaat PowerShell externe sessiegegevens op de externe computer op. 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 de beveiliging wilt verbeteren, kunt u de externe computer configureren voor het gebruik van SSL (Secure Sockets Layer) in plaats van HTTP voor WinRM-aanvragen (Windows Remote Management). Vervolgens kunnen gebruikers de parameter UseSSL 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 PowerShell-remoting. U kunt deze gebruiken op elke computer met PowerShell. Voor de volgende cmdlets is geen PowerShell-verbinding op afstand vereist:

  • Get-HotFix
  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

Als u alle cmdlets met een ComputerName parameter 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 toegang van 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 cmdlet Invoke-Command voor alle andere opdrachten.

Hoe voer ik een opdracht uit op een externe computer?

Als u een opdracht wilt uitvoeren op een externe computer, gebruikt u de cmdlet Invoke-Command. Plaats uw opdracht tussen accolades ({}). Gebruik de parameter ScriptBlock van Invoke-Command om de opdracht op te geven.

Gebruik de parameter ComputerName om Invoke-Command een externe computer op te geven. U kunt ook een permanente verbinding maken met een externe computer (een sessie) en vervolgens de parameter Session van Invoke-Command gebruiken om 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-sectie voor de cmdlets die externe opdrachten 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:>

De opdrachten die u invoert, worden uitgevoerd op de externe computer alsof u ze rechtstreeks op de externe computer hebt ingevoerd.

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 gedrag werkt goed 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_PSSessionsvoor meer informatie over sessies.

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

Ja. De ComputerName parameter van de Invoke-Command cmdlet accepteert meerdere computernamen en de parameter Session 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-artikel voor meer informatie.

Waar zijn mijn profielen?

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

Als u een profiel in een sessie wilt uitvoeren, gebruikt u de cmdlet Invoke-Command.

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

Invoke-Command -Session $s -FilePath $PROFILE

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

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 Register-PSSessionConfigurationvoor meer informatie over sessieconfiguraties.

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.

De snelheidsbeperkingsfunctie is van toepassing op elke opdracht, niet op de gehele sessie of 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 objecten die worden geretourneerd door externe opdrachten. Met serialisatie wordt elk object geconverteerd naar CLIXML-gegevenselementen (Common Language Infrastructure XML) voor verzending.

Wanneer PowerShell een geserialiseerd object ontvangt, wordt de CLIXML geconverteerd naar een gedeserialiseerde objecttype. Het gedeserialiseerde object is een nauwkeurige record van de eigenschappen van het object, maar het is geen live object meer. Het gedeserialiseerde object heeft geen methoden 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 Invoke-Command worden geretourneerd, hebben aanvullende eigenschappen die u helpen de oorsprong van de opdracht te 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_Outputvoor 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. U kunt in de sessie blijven werken terwijl de taak 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 cmdlet Invoke-Command gebruiken om een externe opdracht uit te voeren als achtergrondtaak. En u kunt Invoke-Command gebruiken om een Start-Job opdracht op afstand uit te voeren.

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 Shutdown.exe of Ipconfig.exe uitvoeren op een externe computer.

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

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

Als u externe opdrachten gebruikt om een programma met een gebruikersinterface te starten, wordt het programmaproces gestart, maar wordt de gebruikersinterface niet weergegeven. Het programma wordt nog steeds uitgevoerd. De opdrachtprompt keert pas terug als u het programma stopt of als 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 voeren Notepad , wordt het Kladblok-proces gestart op de externe computer, maar wordt de gebruikersinterface van Kladblok 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. U kunt machtigingen instellen voor deze sessieconfiguraties om te beperken wie opdrachten op afstand op uw computer kan uitvoeren. U kunt ook beperken 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.

Met de Enable-PSRemoting-cmdlet worden de standaardsessieconfiguraties op uw computer gemaakt: Microsoft.PowerShell, Microsoft.PowerShell.Workflow en Microsoft.PowerShell32 (alleen 64-bits besturingssystemen). Enable-PSRemoting stelt de beveiligingsdescriptor voor de configuratie zo in dat alleen leden van de groep Administrators 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 cmdlets Invoke-Command, New-PSSession of Enter-PSSession gebruiken, kunnen ze de parameter ConfigurationName gebruiken om de sessieconfiguratie aan te geven die voor de sessie wordt gebruikt. 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 protocol Web Services for Management (WS-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, WS-Management een verbinding tot stand brengt en een invoegtoepassing voor PowerShell gebruikt 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 op afstand beheer worden niet ondersteund in Windows XP of 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. Remoting via PowerShell is beschikbaar, zelfs als 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:

    De standaardinstelling van netwerktoegang: delen en beveiligingsmodel voor beleid voor lokale accounts is Classic. Controleer of de instelling is ingesteld op Classic.

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

Ja. Normaal gesproken worden de opdrachten zonder fouten uitgevoerd. Echter, mogelijk moet u de referentieparameter gebruiken met Invoke-Command, New-PSSession of Enter-PSSession cmdlets. De inloggegevens kunnen vereist zijn, zelfs wanneer de huidige gebruiker lid is van de Administrators-groep 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 SSHvoor meer informatie.