다음을 통해 공유


원격 도구를 사용하여 Azure VM 문제 해결

Azure VM(가상 머신)의 문제를 해결하는 경우 RDP(원격 데스크톱 프로토콜)를 사용하는 대신 이 문서에서 설명하는 원격 도구를 사용하여 VM에 연결할 수 있습니다.

직렬 콘솔

Azure Virtual Machines 대한 직렬 콘솔을 사용하여 원격 Azure VM에서 명령을 실행합니다.

원격 CMD

PsExec을 다운로드합니다. 다음 명령을 실행하여 VM에 연결합니다.

psexec \\<computer>-u user -s cmd

참고

  • 명령은 동일한 가상 네트워크에 있는 컴퓨터에서 실행되어야 합니다.
  • DIP 또는 HostName을 사용하여 컴퓨터를> 바꿀 <수 있습니다.
  • -s 매개 변수는 시스템 계정(관리자 권한)을 사용하여 명령을 호출하는지 확인합니다.
  • PsExec는 TCP 포트 135 및 445를 사용합니다. 따라서 방화벽에서 두 포트를 열어야 합니다.

실행 명령

실행 명령 기능을 사용하여 VM에서 스크립트를 실행하는 방법에 대한 자세한 내용은 Run 명령을 사용하여 Windows VM에서 PowerShell 스크립트 실행을 참조하세요.

사용자 지정 스크립트 확장

사용자 지정 스크립트 확장 기능을 사용하여 대상 VM에서 사용자 지정 스크립트를 실행할 수 있습니다. 이 기능을 사용하려면 다음 조건을 충족해야 합니다.

  • VM에 연결이 있습니다.

  • Azure Virtual Machine 에이전트가 설치되어 있으며 VM에서 예상대로 작동합니다.

  • 확장은 이전에 VM에 설치되지 않았습니다.

    확장은 스크립트를 처음 사용할 때만 삽입합니다. 나중에 이 기능을 사용하는 경우 확장은 이미 사용되었음을 인식하고 새 스크립트를 업로드하지 않습니다.

스토리지 계정에 스크립트를 업로드하고 자체 컨테이너를 생성합니다. 그런 다음 VM에 연결된 컴퓨터의 Azure PowerShell 다음 스크립트를 실행합니다.

클래식 배포 모델 VM의 경우

중요

클래식 VM은 2023년 9월 1일에 사용 중지됩니다.

ASM에서 IaaS 리소스를 사용하는 경우 2023년 9월 1일까지 마이그레이션을 완료하세요. Azure Resource Manager 다양한 기능 향상 기능을 활용하기 위해 더 빨리 전환하는 것이 좋습니다.

자세한 내용은 2023년 9월 1일까지 IaaS 리소스를 Azure Resource Manager 마이그레이션을 참조하세요.

#Set up the basic variables.
$subscriptionID = "<<SUBSCRIPTION ID>>" 
$storageAccount = "<<STORAGE ACCOUNT>>" 
$localScript = "<<FULL PATH OF THE PS1 FILE TO EXECUTE ON THE VM>>" 
$blobName = "file.ps1" #Name you want for the blob in the storage.
$vmName = "<<VM NAME>>" 
$vmCloudService = "<<CLOUD SERVICE>>" #Resource group or cloud service where the VM is hosted. For example, for "demo305.cloudapp.net" the cloud service is going to be demo305.

#Set up the Azure PowerShell module, and ensure the access to the subscription.
Import-Module Azure
Add-AzureAccount  #Ensure login with the account associated with the subscription ID.
Get-AzureSubscription -SubscriptionId $subscriptionID | Select-AzureSubscription

#Set up the access to the storage account, and upload the script.
$storageKey = (Get-AzureStorageKey -StorageAccountName $storageAccount).Primary
$context = New-AzureStorageContext -StorageAccountName $storageAccount -StorageAccountKey $storageKey
$container = "cse" + (Get-Date -Format yyyyMMddhhmmss)<
New-AzureStorageContainer -Name $container -Permission Off -Context $context
Set-AzureStorageBlobContent -File $localScript -Container $container -Blob $blobName  -Context $context

#Push the script into the VM.
$vm = Get-AzureVM -ServiceName $vmCloudService -Name $vmName
Set-AzureVMCustomScriptExtension "CustomScriptExtension" -VM $vm -StorageAccountName $storageAccount -StorageAccountKey $storagekey -ContainerName $container -FileName $blobName -Run $blobName | Update-AzureVM

Azure Resource Manager VM의 경우

#Set up the basic variables.
$subscriptionID = "<<SUBSCRIPTION ID>>"
$storageAccount = "<<STORAGE ACCOUNT>>"
$storageRG = "<<RESOURCE GROUP OF THE STORAGE ACCOUNT>>" 
$localScript = "<<FULL PATH OF THE PS1 FILE TO EXECUTE ON THE VM>>" 
$blobName = "file.ps1" #Name you want for the blob in the storage.
$vmName = "<<VM NAME>>" 
$vmResourceGroup = "<<RESOURCE GROUP>>"
$vmLocation = "<<DATACENTER>>" 
 
#Set up the Azure PowerShell module, and ensure the access to the subscription.
Login-AzAccount #Ensure login with the account associated with the subscription ID.
Get-AzSubscription -SubscriptionId $subscriptionID | Select-AzSubscription

#Set up the access to the storage account, and upload the script.
$storageKey = (Get-AzStorageAccountKey -ResourceGroupName $storageRG -Name $storageAccount).Value[0]
$context = New-AzureStorageContext -StorageAccountName $storageAccount -StorageAccountKey $storageKey
$container = "cse" + (Get-Date -Format yyyyMMddhhmmss)
New-AzureStorageContainer -Name $container -Permission Off -Context $context
Set-AzureStorageBlobContent -File $localScript -Container $container -Blob $blobName  -Context $context

#Push the script into the VM.
Set-AzVMCustomScriptExtension -Name "CustomScriptExtension" -ResourceGroupName $vmResourceGroup -VMName $vmName -Location $vmLocation -StorageAccountName $storageAccount -StorageAccountKey $storagekey -ContainerName $container -FileName $blobName -Run $blobName

Remote PowerShell

참고

이 옵션을 사용할 수 있도록 TCP 포트 5986(HTTPS)을 열어야 합니다.

Azure Resource Manager VM의 경우 NSG(네트워크 보안 그룹)에서 포트 5986을 열어야 합니다. 자세한 내용은 보안 그룹을 참조하세요.

RDFE VM의 경우 프라이빗 포트(5986)와 공용 포트가 있는 엔드포인트가 있어야 합니다. 그런 다음 NSG에서 해당 공용 포트를 열어야 합니다.

클라이언트 컴퓨터 설정

PowerShell을 사용하여 VM에 원격으로 연결하려면 먼저 연결을 허용하도록 클라이언트 컴퓨터를 설정해야 합니다. 이렇게 하려면 다음 명령을 적절하게 실행하여 PowerShell 신뢰할 수 있는 호스트 목록에 VM을 추가합니다.

신뢰할 수 있는 호스트 목록에 하나의 VM을 추가하려면 다음을 수행합니다.

Set-Item wsman:\localhost\Client\TrustedHosts -value <ComputerName>

신뢰할 수 있는 호스트 목록에 여러 VM을 추가하려면 다음을 수행합니다.

Set-Item wsman:\localhost\Client\TrustedHosts -value <ComputerName1>,<ComputerName2>

신뢰할 수 있는 호스트 목록에 모든 컴퓨터를 추가하려면 다음을 수행합니다.

Set-Item wsman:\localhost\Client\TrustedHosts -value *

VM에서 RemotePS 사용

클래식 배포 모델을 사용하여 만든 VM의 경우 사용자 지정 스크립트 확장을 사용하여 다음 스크립트를 실행합니다.

Enable-PSRemoting -Force
New-NetFirewallRule -Name "Allow WinRM HTTPS" -DisplayName "WinRM HTTPS" -Enabled True -Profile Any -Action Allow -Direction Inbound -LocalPort 5986 -Protocol TCP
$thumbprint = (New-SelfSignedCertificate -DnsName $env:COMPUTERNAME -CertStoreLocation Cert:\LocalMachine\My).Thumbprint
$command = "winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname=""$env:computername""; CertificateThumbprint=""$thumbprint""}"
cmd.exe /C $command

Azure Resource Manager VM의 경우 포털에서 실행 명령을 사용하여 EnableRemotePS 스크립트를 실행합니다.

포털에서 EnableRemotePS 스크립트를 실행하는 단계의 스크린샷

VM에 연결합니다.

클라이언트 컴퓨터 위치에 따라 다음 명령을 실행합니다.

  • 가상 네트워크 또는 배포 외부

    • 클래식 배포 모델을 사용하여 만든 VM의 경우 다음 명령을 실행합니다.

      $Skip = New-PSSessionOption -SkipCACheck -SkipCNCheck
      Enter-PSSession -ComputerName  "<<CLOUDSERVICENAME.cloudapp.net>>" -port "<<PUBLIC PORT NUMBER>>" -Credential (Get-Credential) -useSSL -SessionOption $Skip
      
    • Azure Resource Manager VM의 경우 먼저 공용 IP 주소에 DNS 이름을 추가합니다. 자세한 단계는 Windows VM에 대한 Azure Portal 정규화된 도메인 이름 만들기를 참조하세요. 그런 다음, 다음 명령을 실행합니다.

      $Skip = New-PSSessionOption -SkipCACheck -SkipCNCheck
      Enter-PSSession -ComputerName "<<DNSname.DataCenter.cloudapp.azure.com>>" -port "5986" -Credential (Get-Credential) -useSSL -SessionOption $Skip
      
  • 가상 네트워크 또는 배포 내에서 다음 명령을 실행합니다.

    $Skip = New-PSSessionOption -SkipCACheck -SkipCNCheck
    Enter-PSSession -ComputerName  "<<HOSTNAME>>" -port 5986 -Credential (Get-Credential) -useSSL -SessionOption $Skip
    

참고

SkipCaCheck 플래그를 설정하면 세션을 시작할 때 인증서를 VM으로 가져오기 위한 요구 사항이 무시됩니다.

Invoke-Command cmdlet을 사용하여 원격으로 VM에서 스크립트를 실행할 수도 있습니다.

Invoke-Command -ComputerName "<<COMPUTERNAME>" -ScriptBlock {"<<SCRIPT BLOCK>>"}

원격 레지스트리

참고

이 옵션을 사용하려면 TCP 포트 135 또는 445를 열어야 합니다.

Azure Resource Manager VM의 경우 NSG에서 포트 5986을 열어야 합니다. 자세한 내용은 보안 그룹을 참조하세요.

RDFE VM의 경우 프라이빗 포트 5986 및 공용 포트가 있는 엔드포인트가 있어야 합니다. 또한 NSG에서 해당 공용 포트를 열어야 합니다.

  1. 동일한 가상 네트워크의 다른 VM에서 레지스트리 편집기(regedit.exe)를 엽니다.

  2. 파일>연결 네트워크 레지스트리를 선택합니다.

    네트워크 레지스트리 연결... 스크린샷 레지스트리 편집기 파일 메뉴의 옵션

  3. 선택할 개체 이름 입력 상자에 입력하여 호스트 이름 또는 동적 IP(가급적)로 대상 VM을 찾습니다.

    컴퓨터 선택 대화 상자에서 선택할 개체 이름 입력 상자의 스크린샷

  4. 대상 VM에 대한 자격 증명을 입력합니다.

  5. 필요한 레지스트리를 변경합니다.

원격 서비스 콘솔

참고

이 옵션을 사용하려면 TCP 포트 135 또는 445를 열어야 합니다.

Azure Resource Manager VM의 경우 NSG에서 포트 5986을 열어야 합니다. 자세한 내용은 보안 그룹을 참조하세요.

RDFE VM의 경우 프라이빗 포트 5986 및 공용 포트가 있는 엔드포인트가 있어야 합니다. 또한 NSG에서 해당 공용 포트를 열어야 합니다.

  1. 동일한 가상 네트워크의 다른 VM에서 Services.msc의 instance 엽니다.

  2. 서비스(로컬)를 마우스 오른쪽 단추로 클릭합니다.

  3. 다른 컴퓨터에 연결을 선택합니다.

    서비스(로컬)의 오른쪽 클릭 메뉴에 있는 다른 컴퓨터에 연결 옵션의 스크린샷

  4. 대상 VM의 동적 IP를 입력합니다.

    컴퓨터 선택 대화 상자의 다른 컴퓨터 옵션에 있는 동적 IP 입력 상자의 스크린샷

  5. 서비스에 필요한 변경 내용을 적용합니다.

다음 단계

도움을 요청하십시오.

질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.