Använda JEA

I den här artikeln beskrivs olika sätt att ansluta till och använda en JEA-slutpunkt.

Använda JEA interaktivt

Om du testar JEA-konfigurationen eller har enkla uppgifter för användare kan du använda JEA på samma sätt som en vanlig PowerShell-fjärrkommunikationssession. För komplexa fjärrkommunikationsuppgifter rekommenderar vi att du använder implicit fjärrkommunikation. Implicit fjärrkommunikation gör det möjligt för användare att arbeta med dataobjekten lokalt.

Om du vill använda JEA interaktivt behöver du:

  • Namnet på den dator som du ansluter till (kan vara den lokala datorn)
  • Namnet på JEA-slutpunkten som är registrerad på datorn
  • Autentiseringsuppgifter som har åtkomst till JEA-slutpunkten på datorn

Med den informationen kan du starta en JEA-session med hjälp av cmdletarna New-PSSession eller Enter-PSSession .

$sessionParams = @{
    ComputerName      = 'localhost'
    ConfigurationName = 'JEAMaintenance'
    Credential        = Get-Credential
}
Enter-PSSession @sessionParams

Om det aktuella användarkontot har åtkomst till JEA-slutpunkten kan du utelämna parametern Credential .

När PowerShell-prompten ändras vet [localhost]: PS> du att du nu interagerar med jea-fjärrsessionen. Du kan köra Get-Command för att kontrollera vilka kommandon som är tillgängliga. Kontakta administratören om du vill veta om det finns några begränsningar för tillgängliga parametrar eller tillåtna parametervärden.

Kom ihåg att JEA-sessioner fungerar i NoLanguage läge. Vissa av de sätt som du vanligtvis använder PowerShell på kanske inte är tillgängliga. Du kan till exempel inte använda variabler för att lagra data eller inspektera egenskaperna för objekt som returneras från cmdletar. I följande exempel visas två metoder för att få samma kommandon att fungera i NoLanguage läge.

# Using variables is prohibited in NoLanguage mode. The following will not work:
# $vm = Get-VM -Name 'SQL01'
# Start-VM -VM $vm

# You can use pipes to pass data through to commands that accept input from the pipeline
Get-VM -Name 'SQL01' | Start-VM

# You can also wrap subcommands in parentheses and enter them inline as arguments
Start-VM -VM (Get-VM -Name 'SQL01')

# You can also use parameter sets that don't require extra data to be passed in
Start-VM -VMName 'SQL01'

Om du vill ha mer komplexa kommandoanrop som gör den här metoden svår kan du överväga att använda implicit fjärrkommunikation eller skapa anpassade funktioner som omsluter de funktioner som du behöver. Mer information om NoLanguageModefinns i about_Language_Modes.

Använda JEA med implicit fjärrkommunikation

PowerShell har en implicit fjärrkommunikationsmodell som gör att du kan importera proxy-cmdletar från en fjärrdator och interagera med dem som om de vore lokala kommandon. Implicit fjärrkommunikation förklaras i denna Hey, Scripting Guy!blogginlägg. Implicit fjärrkommunikation är användbart när du arbetar med JEA eftersom du kan arbeta med JEA-cmdletar i ett fullständigt språkläge. Du kan använda tabbar, variabler, manipulera objekt och till och med använda lokala skript för att automatisera uppgifter mot en JEA-slutpunkt. Varje gång du anropar ett proxykommando skickas data till JEA-slutpunkten på fjärrdatorn och körs där.

Implicit fjärrkommunikation fungerar genom att importera cmdletar från en befintlig PowerShell-session. Du kan också välja att prefixa substantiv för varje proxy-cmdlet med valfri sträng. Med prefixet kan du särskilja de kommandon som finns för fjärrsystemet. En tillfällig skriptmodul som innehåller alla proxykommandon skapas och importeras under den lokala PowerShell-sessionen.

# Create a new PSSession to your JEA endpoint
$jeaSession = New-PSSession -ComputerName 'SERVER01' -ConfigurationName 'JEAMaintenance'

# Import the entire PSSession and prefix each imported cmdlet with "JEA"
Import-PSSession -Session $jeaSession -Prefix 'JEA'

# Invoke "Get-Command" on the remote JEA endpoint using the proxy cmdlet
Get-JEACommand

Viktigt!

Vissa system kanske inte kan importera en hel JEA-session på grund av begränsningar i JEA-standard-cmdletarna. För att komma runt detta importerar du bara de kommandon som du behöver från JEA-sessionen genom att uttryckligen ange deras namn till parametern -CommandName . En framtida uppdatering kommer att åtgärda problemet med att importera hela JEA-sessioner på berörda system.

Om du inte kan importera en JEA-session på grund av JEA-begränsningar för standardparametrarna följer du stegen nedan för att filtrera bort standardkommandona från den importerade uppsättningen. Du kan fortsätta använda kommandon som Select-Object, men du använder bara den lokala versionen som är installerad på datorn i stället för den som importeras från jea-fjärrsessionen.

# Create a new PSSession to your JEA endpoint
$jeaSession = New-PSSession -ComputerName 'SERVER01' -ConfigurationName 'JEAMaintenance'

# Get a list of all the commands on the JEA endpoint
$commands = Invoke-Command -Session $jeaSession -ScriptBlock { Get-Command }

# Filter out the default cmdlets
$jeaDefaultCmdlets = @(
    'Clear-Host'
    'Exit-PSSession'
    'Get-Command'
    'Get-FormatData'
    'Get-Help'
    'Measure-Object'
    'Out-Default'
    'Select-Object'
)
$filteredCommands = $commands.Name | Where-Object { $jeaDefaultCmdlets -notcontains $_ }

# Import only commands explicitly added in role capabilities and prefix each
# imported cmdlet with "JEA"
Import-PSSession -Session $jeaSession -Prefix 'JEA' -CommandName $filteredCommands

Du kan också spara de proxierade cmdletarna från implicit fjärrkommunikation med hjälp av Export-PSSession. Mer information om implicit fjärrkommunikation finns i dokumentationen för Import-PSSession och Import-Module.

Använda JEA programmatiskt

JEA kan också användas i automatiseringssystem och i användarprogram, till exempel interna supportappar och webbplatser. Metoden är densamma som för att skapa appar som pratar med obegränsade PowerShell-slutpunkter. Se till att programmet är utformat för att fungera med begränsningar som införts av JEA.

För enkla engångsuppgifter kan du använda Invoke-Command för att köra kommandon i en JEA-session.

Invoke-Command -ComputerName 'SERVER01' -ConfigurationName 'JEAMaintenance' -ScriptBlock {
    Get-Process
    Get-Service
}

Om du vill kontrollera vilka kommandon som är tillgängliga för användning när du ansluter till en JEA-session kör Get-Command du och itererar genom resultaten för att söka efter de tillåtna parametrarna.

$commandParameters = @{
    ComputerName      = 'SERVER01'
    ConfigurationName = 'JEAMaintenance'
    ScriptBlock       = { Get-Command }
}
Invoke-Command @commandParameters |
    Where-Object { $_.CommandType -in @('Function', 'Cmdlet') } |
    Format-Table Name, Parameters

Om du skapar en C#-app kan du skapa en PowerShell-runspace som ansluter till en JEA-session genom att ange konfigurationsnamnet i ett WSMan Anslut ionInfo-objekt.

// using System.Management.Automation;
var computerName = "SERVER01";
var configName   = "JEAMaintenance";
// See https://learn.microsoft.com/dotnet/api/system.management.automation.pscredential
var creds        = // create a PSCredential object here

WSManConnectionInfo connectionInfo = new WSManConnectionInfo(
    false,                 // Use SSL
    computerName,          // Computer name
    5985,                  // WSMan Port
    "/wsman",              // WSMan Path
                           // Connection URI with config name
    string.Format(
        CultureInfo.InvariantCulture,
        "http://schemas.microsoft.com/powershell/{0}",
        configName
    ),
    creds                  // Credentials
);

// Now, use the connection info to create a runspace where you can run the commands
using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
    // Open the runspace
    runspace.Open();

    using (PowerShell ps = PowerShell.Create())
    {
        // Set the PowerShell object to use the JEA runspace
        ps.Runspace = runspace;

        // Now you can add and invoke commands
        ps.AddCommand("Get-Command");
        foreach (var result in ps.Invoke())
        {
            Console.WriteLine(result);
        }
    }

    // Close the runspace
    runspace.Close();
}

Använda JEA med PowerShell Direct

Hyper-V i Windows 10 och Windows Server 2016 erbjuder PowerShell Direct, en funktion som gör att Hyper-V-administratörer kan hantera virtuella datorer med PowerShell oavsett nätverkskonfiguration eller fjärrhanteringsinställningar på den virtuella datorn.

Du kan använda PowerShell Direct med JEA för att ge en Hyper-V-administratör begränsad åtkomst till den virtuella datorn. Detta kan vara användbart om du förlorar nätverksanslutningen till den virtuella datorn och behöver en datacenteradministratör för att åtgärda nätverksinställningarna.

Ingen ytterligare konfiguration krävs för att använda JEA via PowerShell Direct. Gästoperativsystemet som körs på den virtuella datorn måste dock vara Windows 10, Windows Server 2016 eller senare. Hyper-V-administratören kan ansluta till JEA-slutpunkten med hjälp av parametrarna -VMName eller -VMId på PSRemoting-cmdletar:

$sharedParams = @{
    ConfigurationName = 'NICMaintenance'
    Credential        = Get-Credential -UserName 'localhost\JEAformyHoster'
}
# Entering a JEA session using PowerShell Direct when the VM name is unique
Enter-PSSession -VMName 'SQL01' @sharedParams

# Entering a JEA session using PowerShell Direct using VM ids
$vm = Get-VM -VMName 'MyVM' | Select-Object -First 1
Enter-PSSession -VMId $vm.VMId @sharedParams

Vi rekommenderar att du skapar ett dedikerat användarkonto med de minsta behörigheter som krävs för att hantera systemet för användning av en Hyper-V-administratör. Kom ihåg att även en icke-privilegierad användare kan logga in på en Windows-dator som standard, inklusive att använda obegränsad PowerShell. Det gör att de kan bläddra i filsystemet och lära sig mer om din OS-miljö. Om du vill låsa en Hyper-V-administratör och begränsa dem till att endast komma åt en virtuell dator med PowerShell Direct med JEA måste du neka lokal inloggningsbehörighet till Hyper-V-administratörens JEA-konto.