다음을 통해 공유


JEA 사용

이 문서에서는 JEA 엔드포인트에 연결하고 사용할 수 있는 다양한 방법을 설명합니다.

대화형으로 JEA 사용

JEA 구성을 테스트하거나 사용자에 대한 간단한 작업이 있는 경우 일반 PowerShell 원격 세션과 동일한 방식으로 JEA를 사용할 수 있습니다. 복잡한 원격 작업의 경우 암시적 원격을 사용하는 것이 좋습니다. 암시적 원격을 통해 사용자는 데이터 개체를 로컬에서 작동할 수 있습니다.

대화형으로 JEA를 사용하려면 다음이 필요합니다.

  • 연결하는 컴퓨터의 이름(로컬 머신일 수 있음)
  • 해당 컴퓨터에 등록된 JEA 엔드포인트의 이름
  • 해당 컴퓨터의 JEA 엔드포인트에 액세스할 수 있는 자격 증명

해당 정보가 제공되면 New-PSSession 또는 Enter-PSSession cmdlet을 사용하여 JEA 세션을 시작할 수 있습니다.

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

현재 사용자 계정에 JEA 엔드포인트에 대한 액세스 권한이 있는 경우 자격 증명 매개 변수를 생략할 수 있습니다.

PowerShell 프롬프트가 변경 [localhost]: PS> 되면 이제 원격 JEA 세션과 상호 작용하고 있음을 알 수 있습니다. 실행할 Get-Command 수 있는 명령을 검사 수 있습니다. 사용 가능한 매개 변수 또는 허용되는 매개 변수 값에 대한 제한이 있는지 알아보려면 관리자에게 문의하세요.

JEA 세션은 모드에서 NoLanguage 작동합니다. 일반적으로 PowerShell을 사용하는 방법 중 일부는 사용할 수 없습니다. 예를 들어 변수를 사용하여 데이터를 저장하거나 cmdlet에서 반환된 개체의 속성을 검사할 수 없습니다. 다음 예제에서는 모드에서 NoLanguage 동일한 명령을 사용하는 두 가지 방법을 보여 줍니다.

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

이 접근 방식을 어렵게 만드는 더 복잡한 명령 호출의 경우 암시적 원격 사용 또는 필요한 기능을 래핑하는 사용자 지정 함수 만들기를 고려하세요. 자세한 내용은 NoLanguageModeabout_Language_Modes 참조하세요.

암시적 원격으로 JEA 사용

PowerShell에는 원격 머신에서 프록시 cmdlet을 가져와 로컬 명령인 것처럼 상호 작용할 수 있는 암시적 원격 모델이 있습니다. 암시적 원격은 이 Hey, Scripting Guy!블로그 게시물에 설명되어 있습니다. 암시적 원격은 전체 언어 모드에서 JEA cmdlet으로 작업할 수 있으므로 JEA로 작업할 때 유용합니다. 탭 완성, 변수, 개체 조작, 로컬 스크립트를 사용하여 JEA 엔드포인트에 대한 작업을 자동화할 수도 있습니다. 프록시 명령을 호출할 때마다 데이터가 원격 컴퓨터의 JEA 엔드포인트로 전송되고 그곳에서 실행됩니다.

암시적 원격은 기존 PowerShell 세션에서 cmdlet을 가져오는 방식으로 작동합니다. 필요에 따라 각 프록시 cmdlet의 명사 앞에 선택한 문자열을 접두사로 지정할 수 있습니다. 접두사를 사용하면 원격 시스템에 대한 명령을 구분할 수 있습니다. 모든 프록시 명령을 포함하는 임시 스크립트 모듈은 로컬 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

Important

일부 시스템은 기본 JEA cmdlet의 제약 조건으로 인해 전체 JEA 세션을 가져오지 못할 수 있습니다. 이 문제를 해결하려면 필요한 명령의 이름을 명시적으로 -CommandName 매개 변수에 제공하여 JEA 세션에서 필요한 명령만 가져옵니다. 향후 업데이트는 영향을 받는 시스템에서 전체 JEA 세션을 가져오는 문제를 해결합니다.

기본 매개 변수에 대한 JEA 제약 조건으로 인해 JEA 세션을 가져올 수 없는 경우 아래 단계에 따라 가져온 집합에서 기본 명령을 필터링합니다. 같은 Select-Object명령을 계속 사용할 수 있지만 원격 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

Export-PSSession을 사용하여 암시적 원격에서 프록시된 cmdlet을 유지할 수도 있습니다. 암시적 원격에 대한 자세한 내용은 Import-PSSession 및 Import-Module에 대한 설명서를 참조하세요.

프로그래밍 방식으로 JEA 사용

JEA는 자동화 시스템 및 사내 기술 지원팀 앱 및 웹 사이트와 같은 사용자 애플리케이션에서도 사용할 수 있습니다. 이 접근 방식은 제약이 없는 PowerShell 엔드포인트와 통신하는 앱을 빌드하는 경우와 동일합니다. 프로그램이 JEA에 의해 부과된 제한 사항과 함께 작동하도록 설계되었는지 확인합니다.

간단한 일회성 작업의 경우 Invoke-Command를 사용하여 JEA 세션에서 명령을 실행할 수 있습니다.

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

JEA 세션에 연결할 때 사용할 수 있는 명령을 확인하려면 Get-Command를 실행하고 결과를 반복하여 허용되는 매개 변수를 확인합니다.

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

C# 앱을 빌드하는 경우 WSMan커넥트ionInfo 개체에서 구성 이름을 지정하여 JEA 세션에 연결하는 PowerShell Runspace를 만들 수 있습니다.

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

PowerShell Direct에서 JEA 사용

Windows 10 및 Windows Server 2016의 Hyper-V는 가상 머신의 네트워크 구성 또는 원격 관리 설정에 관계없이 Hyper-V 관리자가 PowerShell을 사용하여 가상 머신을 관리할 수 있게 해주는 기능인 PowerShell Direct를 제공합니다.

JEA와 함께 PowerShell Direct를 사용하여 Hyper-V 관리자에게 VM에 대한 제한된 액세스 권한을 부여할 수 있습니다. 이는 VM에 대한 네트워크 연결이 끊어지고 네트워크 설정을 수정하기 위해 데이터 센터 관리자가 필요한 경우에 유용할 수 있습니다.

PowerShell Direct에서 JEA를 사용하기 위한 추가 구성이 필요하지 않습니다. 그러나 가상 머신 내에서 실행되는 게스트 운영 체제는 Windows 10, Windows Server 2016 이상이어야 합니다. Hyper-V 관리자는 PSRemoting cmdlet의 -VMName 매개 변수를 -VMId 사용하여 JEA 엔드포인트에 연결할 수 있습니다.

$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

Hyper-V 관리자가 사용할 시스템을 관리하는 데 필요한 최소 권한으로 전용 사용자 계정을 만드는 것이 좋습니다. 권한 없는 사용자도 비제한 PowerShell 사용을 포함하여 기본적으로 Windows 컴퓨터에 로그인할 수 있습니다. 이를 통해 파일 시스템을 찾아보고 OS 환경에 대해 자세히 알아볼 수 있습니다. Hyper-V 관리자를 잠그고 JEA에서 PowerShell Direct를 사용하여 VM에만 액세스하도록 제한하려면 Hyper-V 관리자의 JEA 계정에 대한 로컬 로그온 권한을 거부해야 합니다.