使用远程工具排查 Azure VM 问题

适用于:✔️ Windows VM

排查 Azure 虚拟机(VM)上的问题时,可以使用本文中讨论的远程工具而不是使用远程桌面协议(RDP)连接到 VM。

串行控制台

使用适用于 Azure 虚拟机的串行控制台在远程 Azure VM 上运行命令。

远程 CMD

下载 PsExec。 运行以下命令连接到 VM:

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

注意

  • 该命令必须在同一虚拟网络中的计算机上运行。
  • DIP 或 HostName 可用于替换 <计算机>。
  • -s 参数确保使用系统帐户(管理员权限)调用命令。
  • PsExec 使用 TCP 端口 135 和 445。 因此,必须在防火墙上打开这两个端口。

运行命令

有关如何使用 run 命令功能在 VM 上运行脚本的详细信息,请参阅 使用 run 命令在 Windows VM 中运行 PowerShell 脚本。

自定义脚本扩展

可以使用“自定义脚本扩展”功能在目标 VM 上运行自定义脚本。 若要使用此功能,必须符合以下条件:

  • VM 已建立连接。

  • Azure 虚拟机代理已安装,并在 VM 上按预期工作。

  • 该扩展以前未安装在 VM 上。

    该扩展仅在第一次使用脚本时注入该脚本。 如果稍后使用此功能,扩展会识别它已使用,并且不会上传新脚本。

将脚本上传到存储帐户,并生成自己的容器。 然后,在已连接到 VM 的计算机上的 Azure PowerShell 中运行以下脚本。

对于 Azure 资源管理器 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

远程 PowerShell

注意

必须打开 TCP 端口 5986 (HTTPS),以便能够使用此选项。

对于 Azure 资源管理器 VM,必须在网络安全组(NSG)上打开端口 5986。 有关详细信息,请参阅安全组。

对于 RDFE VM,必须有一个配备专用端口 (5986) 和公共端口的终结点。 然后,还必须在 NSG 上打开面向公众的端口。

设置客户端计算机

若要使用 PowerShell 远程连接到 VM,首先需要设置客户端计算机,以允许建立连接。 为此,请相应地运行以下命令,将 VM 添加到 PowerShell 信任的主机列表。

若要将一个 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 资源管理器 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 资源管理器 VM,首先将 DNS 名称添加到公共 IP 地址。 有关详细步骤,请参阅在 Azure 门户中创建 Windows VM 的完全限定域名。 然后,运行以下命令:

      $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 资源管理器 VM,必须在 NSG 上打开端口 5986。 有关详细信息,请参阅安全组。

对于 RDFE VM,必须有一个配备专用端口 5986 和公共端口的终结点。 还必须在 NSG 上打开面向公众的端口。

  1. 从同一虚拟网络上的另一个 VM 打开注册表编辑器(regedit.exe)。

  2. 选择“文件”>“连接网络注册表”。

    连接网络注册表的屏幕截图...注册表编辑器的“文件”菜单中的选项

  3. 通过在“输入要选择的对象名称”框中输入目标 VM,按主机名动态 IP(最好)找到目标 VM。

    “选择计算机”对话框中“输入要选择的对象名称”框的屏幕截图。

  4. 输入目标 VM 的凭据。

  5. 进行任何必要的注册表更改。

远程服务控制台

注意

必须打开 TCP 端口 135 或 445 才能使用此选项。

对于 Azure 资源管理器 VM,必须在 NSG 上打开端口 5986。 有关详细信息,请参阅安全组。

对于 RDFE VM,必须有一个配备专用端口 5986 和公共端口的终结点。 还必须在 NSG 上打开面向公众的端口。

  1. 从同一虚拟网络上的另一个 VM 打开 Services.msc 实例

  2. 右键单击“服务(本地)”。

  3. 选择“连接到另一台计算机”。

    右键单击服务(本地)菜单中“连接到另一台计算机”选项的屏幕截图。

  4. 输入目标 VM 的动态 IP。

    “选择计算机”对话框中“另一台计算机”选项中动态 IP 输入框的屏幕截图。

  5. 对服务进行任何必要的更改。

后续步骤

  • 有关 Enter-PSSession cmdlet 的详细信息,请参阅 Enter-PSSession
  • 有关使用经典部署模型为 Windows 的自定义脚本扩展的详细信息,请参阅 适用于 Windows 的自定义脚本扩展。
  • PsExec 包含在 PSTools Suite 中。
  • 有关 PSTools 套件的详细信息,请参阅 PSTools

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区