Korzystanie z usługi JEA

W tym artykule opisano różne sposoby nawiązywania połączenia z punktem końcowym JEA i korzystania z niego.

Interakcyjne używanie narzędzia JEA

Jeśli testujesz konfigurację serwera JEA lub masz proste zadania dla użytkowników, możesz użyć narzędzia JEA w taki sam sposób, jak zwykła sesja komunikacji zdalnej programu PowerShell. W przypadku złożonych zadań komunikacji wirtualnej zaleca się używanie niejawnej komunikacji wirtualnej. Niejawna komunikacja zdalna umożliwia użytkownikom lokalne działanie z obiektami danych.

Aby korzystać z usługi JEA interaktywnie, potrzebne są następujące elementy:

  • Nazwa komputera, z którym nawiązujesz połączenie (może to być komputer lokalny)
  • Nazwa punktu końcowego JEA zarejestrowanego na tym komputerze
  • Poświadczenia, które mają dostęp do punktu końcowego JEA na tym komputerze

Biorąc pod uwagę te informacje, możesz uruchomić sesję JEA przy użyciu poleceń cmdlet New-PSSession lub Enter-PSSession .

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

Jeśli bieżące konto użytkownika ma dostęp do punktu końcowego JEA, możesz pominąć parametr Credential .

Gdy program PowerShell wyświetli monit o [localhost]: PS> zmianę, wiesz, że korzystasz teraz ze zdalnej sesji JEA. Możesz uruchomić polecenie Get-Command , aby sprawdzić, które polecenia są dostępne. Skontaktuj się z administratorem, aby dowiedzieć się, czy istnieją jakiekolwiek ograniczenia dotyczące dostępnych parametrów lub dozwolonych wartości parametrów.

Pamiętaj, że sesje JEA działają w NoLanguage trybie. Niektóre sposoby, w jakie zwykle używasz programu PowerShell, mogą być niedostępne. Na przykład nie można używać zmiennych do przechowywania danych ani sprawdzania właściwości obiektów zwracanych z poleceń cmdlet. W poniższym przykładzie przedstawiono dwa podejścia umożliwiające uzyskanie tych samych poleceń do pracy w NoLanguage trybie.

# 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'

Aby uzyskać bardziej złożone wywołania poleceń, które utrudniają to podejście, rozważ użycie niejawnej komunikacji bezpośredniej lub utworzenie funkcji niestandardowych, które opakowują wymagane funkcje. Aby uzyskać więcej informacji na temat NoLanguageModeprogramu , zobacz about_Language_Modes.

Używanie usługi JEA z niejawną komunikacjią zdalną

Program PowerShell ma niejawny model komunikacji zdalnej, który umożliwia importowanie poleceń cmdlet serwera proxy z komputera zdalnego i interakcję z nimi tak, jakby były lokalnymi poleceniami. Niejawna komunikacja zdalna jest wyjaśniona w tym Hej, Scripting Guy!wpis w blogu. Niejawna komunikacja zdalna jest przydatna podczas pracy z usługą JEA, ponieważ umożliwia pracę z poleceniami cmdlet JEA w trybie pełnojęzycznym. Do automatyzowania zadań względem punktu końcowego JEA można używać uzupełniania kart, zmiennych, manipulowania obiektami, a nawet używania skryptów lokalnych. Za każdym razem, gdy wywołasz polecenie serwera proxy, dane są wysyłane do punktu końcowego JEA na maszynie zdalnej i wykonywane tam.

Niejawna komunikacja zdalna działa przez zaimportowanie poleceń cmdlet z istniejącej sesji programu PowerShell. Opcjonalnie możesz wybrać prefiks do prefiksu dla każdego polecenia cmdlet serwera proxy z wybranym ciągiem. Prefiks umożliwia odróżnienie poleceń, które są przeznaczone dla systemu zdalnego. Tymczasowy moduł skryptu zawierający wszystkie polecenia serwera proxy jest tworzony i importowany na czas trwania lokalnej sesji programu PowerShell.

# 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

Ważne

Niektóre systemy mogą nie być w stanie zaimportować całej sesji JEA z powodu ograniczeń w domyślnych poleceniach cmdlet JEA. Aby to obejść, zaimportuj tylko potrzebne polecenia z sesji JEA, jawnie podając ich nazwy do parametru -CommandName . Przyszła aktualizacja rozwiąże problem z importowaniem całych sesji JEA w systemach, których dotyczy problem.

Jeśli nie możesz zaimportować sesji JEA z powodu ograniczeń serwera JEA dla parametrów domyślnych, wykonaj poniższe kroki, aby odfiltrować domyślne polecenia z zaimportowanego zestawu. Możesz nadal używać poleceń, takich jak Select-Object, ale po prostu użyjesz lokalnej wersji zainstalowanej na komputerze, a nie z tej zaimportowanej ze zdalnej sesji JEA.

# 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

Możesz również utrwały polecenia cmdlet proxied z niejawnej komunikacji bezpośredniej przy użyciu polecenia Export-PSSession. Aby uzyskać więcej informacji na temat niejawnej komunikacji zdalniej, zobacz dokumentację dotyczącą import-PSSession i Import-Module.

Programowe używanie narzędzia JEA

JeA może być również używany w systemach automatyzacji i aplikacjach użytkowników, takich jak wewnętrzne aplikacje pomocy technicznej i witryny internetowe. Podejście to jest takie samo, jak w przypadku tworzenia aplikacji, które komunikują się z nieskrępowanymi punktami końcowymi programu PowerShell. Upewnij się, że program jest przeznaczony do pracy z ograniczeniami narzuconymi przez usługę JEA.

W przypadku prostych, jednorazowych zadań można użyć polecenia Invoke-Command do uruchamiania poleceń w sesji JEA.

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

Aby sprawdzić, które polecenia są dostępne do użycia podczas nawiązywania połączenia z sesją JEA, uruchom Get-Command polecenie i wykonaj iterację po wynikach, aby sprawdzić dozwolone parametry.

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

Jeśli tworzysz aplikację języka C#, możesz utworzyć przestrzeń uruchamiania programu PowerShell, która łączy się z sesją JEA, określając nazwę konfiguracji w obiekcie WSMan Połączenie ionInfo.

// 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();
}

Używanie narzędzia JEA z programem PowerShell Direct

Funkcja Hyper-V w systemach Windows 10 i Windows Server 2016 oferuje program PowerShell Direct, funkcję umożliwiającą administratorom funkcji Hyper-V zarządzanie maszynami wirtualnymi przy użyciu programu PowerShell niezależnie od konfiguracji sieci lub ustawień zdalnego zarządzania na maszynie wirtualnej.

Możesz użyć programu PowerShell Direct z usługą JEA, aby przyznać administratorowi funkcji Hyper-V ograniczony dostęp do maszyny wirtualnej. Może to być przydatne, jeśli utracisz łączność sieciową z maszyną wirtualną i potrzebujesz administratora centrum danych, aby naprawić ustawienia sieci.

Do korzystania z narzędzia JEA za pośrednictwem programu PowerShell Direct nie jest wymagana żadna dodatkowa konfiguracja. Jednak system operacyjny gościa uruchomiony wewnątrz maszyny wirtualnej musi być windows 10, Windows Server 2016 lub nowszy. Administrator funkcji Hyper-V może nawiązać połączenie z punktem końcowym JEA przy użyciu -VMName parametrów lub -VMId w poleceniach cmdlet PSRemoting:

$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

Zaleca się utworzenie dedykowanego konta użytkownika z minimalnymi uprawnieniami wymaganymi do zarządzania systemem do użycia przez administratora funkcji Hyper-V. Pamiętaj, że nawet nieuprzywilejowany użytkownik może domyślnie zalogować się do maszyny z systemem Windows, w tym przy użyciu nieuprzywilejowanego programu PowerShell. Dzięki niemu można przeglądać system plików i dowiedzieć się więcej o środowisku systemu operacyjnego. Aby zablokować administratora funkcji Hyper-V i ograniczyć je tylko do uzyskiwania dostępu do maszyny wirtualnej przy użyciu programu PowerShell Direct z usługą JEA, musisz odmówić lokalnych praw logowania do konta JEA administratora funkcji Hyper-V.