다음을 통해 공유


PowerShell을 사용한 Virtual Machine 자동화 및 관리

PowerShell Direct를 사용하여 Hyper-V 호스트에서 Windows 10 이상 또는 Windows Server 2016 이상 가상 머신에서 임의의 PowerShell을 실행할 수 있습니다. 네트워크 구성 또는 원격 관리 설정에 관계없이 PowerShell Direct를 사용합니다.

다음과 같은 몇 가지 방법으로 PowerShell Direct를 실행할 수 있습니다.

요구 사항

운영 체제 요구 사항:

  • 호스트: Windows 10, Windows Server 2016 이상에서 Hyper-V를 실행합니다.
  • 게스트/가상 머신: Windows 10, Windows Server 2016 이상.

이전 가상 컴퓨터를 관리하는 경우 가상 컴퓨터 연결(VMConnect)을 사용하거나 가상 컴퓨터에 대한 가상 네트워크를 구성합니다.

구성 요구 사항:

  • 가상 머신은 호스트에서 로컬로 실행되어야 합니다.
  • 가상 머신을 켜고 하나 이상의 구성된 사용자 프로필로 실행해야 합니다.
  • Hyper-V 관리자로 호스트 컴퓨터에 로그인해야 합니다.
  • 가상 컴퓨터에 대해 유효한 사용자 자격 증명을 제공해야 합니다.

대화형 PowerShell 세션 만들기 및 종료

가상 머신에서 PowerShell 명령을 실행하는 가장 쉬운 방법은 대화형 세션을 시작하는 것입니다.

세션이 시작되면 입력한 명령이 가상 머신 자체의 PowerShell 세션에 직접 입력한 것처럼 가상 머신에서 실행됩니다.

대화형 세션을 시작하는 방법은 다음과 같습니다.

  1. Hyper-V 호스트에서 관리자 권한으로 PowerShell을 엽니다.

  2. 다음 명령 중 하나를 실행하여 가상 머신 이름 또는 GUID를 사용하여 대화형 세션을 만듭니다.

    Enter-PSSession -VMName <VMName>
    Enter-PSSession -VMId <VMId>
    

    메시지가 표시되면 가상 머신에 대한 자격 증명을 제공합니다.

  3. 가상 머신에서 명령을 실행합니다. 다음과 같이 PowerShell 프롬프트의 접두사로 VMName이 표시됩니다.

    [VMName]: PS C:\>
    

    모든 명령 실행은 가상 머신에서 실행됩니다. 테스트하려면 가상 머신에서 이러한 명령을 실행 ipconfig 하거나 hostname 실행 중인지 확인할 수 있습니다.

  4. 완료되면 다음 명령을 실행하여 세션을 닫습니다.

     Exit-PSSession 
    

참고 항목

세션이 연결되지 않으면 문제 해결에서 잠재적 원인을 확인하세요.

이러한 cmdlet 에 대한 자세한 내용은 Enter-PSSessionExit-PSSession을 참조하세요.

Invoke-Command를 사용하여 스크립트 또는 명령 실행

Invoke-Command를 사용하는 PowerShell Direct는 가상 머신에서 명령 하나 또는 스크립트 하나를 실행해야 하지만 해당 시점 이후에도 가상 머신과 계속 상호 작용할 필요가 없는 경우에 적합합니다.

단일 명령을 실행하는 방법은 다음과 같습니다.

  1. Hyper-V 호스트에서 관리자 권한으로 PowerShell을 엽니다.

  2. 다음 명령 중 하나를 실행하여 가상 머신 이름 또는 GUID를 사용하여 세션을 만듭니다.

    Invoke-Command -VMName <VMName> -ScriptBlock { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    메시지가 표시되면 가상 머신에 대한 자격 증명을 제공합니다.

    이 명령은 가상 머신에서 실행됩니다. 콘솔에 출력이 있는 경우 콘솔에 출력됩니다. 명령이 실행되는 즉시 연결이 자동으로 닫힙니다.

스크립트를 실행하는 방법은 다음과 같습니다.

  1. Hyper-V 호스트에서 관리자 권한으로 PowerShell을 엽니다.

  2. 다음 명령 중 하나를 실행하여 가상 머신 이름 또는 GUID를 사용하여 세션을 만듭니다.

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    메시지가 표시되면 가상 머신에 대한 자격 증명을 제공합니다.

    스크립트는 가상 머신에서 실행됩니다. 명령이 실행되는 즉시 연결이 자동으로 닫힙니다.

이 cmdlet에 대한 자세한 내용은 Invoke-Command를 참조하세요.

New-PSSession 및 Copy-Item을 사용하여 파일 복사

참고 항목

PowerShell Direct는 Windows 빌드 14280 이상에서만 영구 세션을 지원합니다.

영구 PowerShell 세션은 하나 이상의 원격 컴퓨터에서 작업을 조정하는 스크립트를 작성할 때 매우 유용합니다. 만든 후에는 영구 세션이 삭제될 때까지 백그라운드에 존재합니다. 즉, 자격 증명을 전달하거나 Enter-PSSession 전달하지 않고도 동일한 세션을 반복해서 Invoke-Command 참조할 수 있습니다.

동일한 토큰으로 세션은 상태를 유지합니다. 영구 세션이 지속되므로 세션에서 생성되거나 세션에 전달된 모든 변수는 여러 호출에 걸쳐 유지됩니다. 영구 세션 작업에 사용할 수 있는 여러 도구가 있습니다. 이 예제에서는 New-PSSessionCopy-Item을 사용하여 호스트에서 가상 머신으로, 가상 머신에서 호스트로 데이터를 이동합니다.

세션을 만든 후 파일을 복사하는 방법은 다음과 같습니다.

  1. Hyper-V 호스트에서 관리자 권한으로 PowerShell을 엽니다.

  2. 다음 명령 중 하나를 실행하여 가상 머신 New-PSSession에 대한 영구 PowerShell 세션을 만듭니다.

    $s = New-PSSession -VMName <VMName> -Credential (Get-Credential)
    $s = New-PSSession -VMId <VMId> -Credential (Get-Credential)
    

    메시지가 표시되면 가상 머신에 대한 자격 증명을 제공합니다.

    Warning

    14500 이전 빌드에는 버그가 있습니다. 자격 증명이 플래그로 -Credential 명시적으로 지정되지 않은 경우 게스트의 서비스가 중단되고 다시 시작해야 합니다. 이 문제가 발생하면 오류: 원격 세션이 종료되었을 수 있는 섹션에서 해결 방법 지침을 사용할 수 있습니다.

  3. 가상 머신에 파일을 복사합니다.

    호스트 컴퓨터에서 가상 머신으로 복사 C:\host_path\data.txt 하려면 다음을 실행합니다.

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
    
  4. 가상 머신에서 호스트로 파일을 복사합니다.

    가상 머신에서 호스트로 복사 C:\guest_path\data.txt 하려면 다음을 실행합니다.

    Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
    
  5. 를 사용하여 Remove-PSSession영구 세션을 중지합니다.

    Remove-PSSession $s
    

문제 해결

PowerShell Direct를 통해 표시되는 일반적인 오류 메시지의 작은 집합이 있습니다. 다음 섹션에서는 문제를 진단하기 위한 가장 일반적인 오류 메시지, 일부 원인 및 도구에 대해 설명합니다.

-VMName 또는 -VMID 매개 변수가 없습니다.

문제:

Enter-PSSession, Invoke-Command 또는 New-PSSession-VMName 또는 -VMId 매개 변수가 없습니다.

가능한 원인:

가장 가능성이 큰 문제는 PowerShell Direct가 호스트 운영 체제에서 지원되지 않는다는 것입니다.

다음 명령을 실행하여 Windows 빌드를 확인할 수 있습니다.

[System.Environment]::OSVersion.Version

지원되는 빌드를 실행하는 경우 PowerShell 버전이 PowerShell Direct를 실행하지 않을 수도 있습니다. PowerShell Direct 및 JEA의 경우 주 버전은 5 이상이어야 합니다.

다음 명령을 실행하여 PowerShell 버전 빌드를 확인할 수 있습니다.

$PSVersionTable.PSVersion

오류: 원격 세션이 종료되었을 수 있습니다.

참고 항목

호스트 빌드 10240과 12400 사이의 Enter-PSSession의 경우 아래의 모든 오류는 "원격 세션이 종료되었을 수 있습니다"로 보고됩니다.

오류 메시지:

Enter-PSSession: Windows PowerShell에서 처리할 수 없는 오류가 발생했습니다. 원격 세션이 종료되었을 수 있습니다.

가능한 원인:

  • 가상 머신이 있지만 실행되고 있지 않습니다.
  • 게스트 OS는 PowerShell Direct를 지원하지 않습니다. 요구 사항을 참조하세요.
  • 아직 게스트에서 PowerShell을 사용할 수 없습니다.
    • 운영 체제가 부팅을 완료하지 않았습니다.
    • 운영 체제가 올바르게 부팅할 수 없습니다.
    • 일부 부팅 시간 이벤트에는 사용자 입력이 필요합니다.

Get-VM cmdlet을 사용하여 호스트에서 실행 중인 VM을 확인할 수 있습니다.

오류 메시지:

New-PSSession: Windows PowerShell에서 처리할 수 없는 오류가 발생했습니다. 원격 세션이 종료되었을 수 있습니다.

가능한 원인:

  • 위에 나열된 원인 중 하나. 모든 원인이 New-PSSession에 동일하게 적용됩니다.
  • 자격 증명을 명시적으로 전달해야 하는 현재 빌드의 버그입니다 -Credential. 이 경우 전체 서비스가 게스트 운영 체제에서 중단되고 다시 시작해야 합니다. Enter-PSSession에서 세션을 계속 사용할 수 있는지 확인할 수 있습니다.

자격 증명 문제를 해결하려면 VMConnect를 사용하여 가상 머신에 로그인하고 PowerShell을 열고 다음 PowerShell을 사용하여 vmicvmsession 서비스를 다시 시작합니다.

Restart-Service -Name vmicvmsession

오류: 매개 변수 집합을 확인할 수 없습니다.

오류 메시지:

Enter-PSSession: 지정된 명명된 매개 변수를 사용하여 매개 변수 집합을 확인할 수 없습니다.

가능한 원인:

  • 가상 머신에 연결할 때 -RunAsAdministrator가 지원되지 않습니다.

    Windows 컨테이너에 연결할 때 플래그는 -RunAsAdministrator 명시적 자격 증명 없이 관리자 연결을 허용합니다. 가상 머신은 호스트에 암시적 관리자 액세스 권한을 부여하지 않으므로 자격 증명을 명시적으로 입력해야 합니다.

관리자 자격 증명은 매개 변수를 사용하여 -Credential 가상 머신에 전달하거나 메시지가 표시되면 수동으로 입력하여 전달할 수 있습니다.

오류: 자격 증명이 잘못되었습니다.

오류 메시지:

Enter-PSSession: 자격 증명이 잘못되었습니다.

가능한 원인:

  • 게스트 자격 증명의 유효성을 검사할 수 없습니다.
    • 제공된 자격 증명이 잘못되었습니다.
    • 게스트에 사용자 계정이 없습니다(OS가 이전에 부팅되지 않음).
    • 관리자 권한으로 연결하는 경우: 관리자가 활성 사용자로 설정되지 않았습니다. 기본 제공 관리자 계정 사용 및 사용 안 함에서 자세히 알아보세요.

오류: 입력 VMName 매개 변수가 가상 머신으로 확인되지 않습니다.

오류 메시지:

Enter-PSSession: 입력 VMName 매개 변수가 가상 머신으로 확인되지 않습니다.

가능한 원인:

  • Hyper-V 관리자가 아닙니다.
  • 가상 머신이 없습니다.

Get-VM cmdlet을 사용하여 사용 중인 자격 증명에 Hyper-V 관리자 역할이 있는지 확인하고 호스트에서 로컬로 실행되고 부팅된 VM을 확인할 수 있습니다.

샘플 및 사용자 가이드

PowerShell Direct는 JEA(Just Enough Administration)를 지원합니다.

GitHub에서 샘플을 확인하세요.