PowerShell 远程管理Windows Azure 上面的虚拟机 9


远程创建和管理Windows Azure 上面的虚拟机可以使用Windows Azure SDK,包括Rest API版, .NET版,PowerShell版。但是如果要使用PowerShell远程管理Windows Azure 上面虚拟机的内部对象,例如文件,进程,服务,注册表等,可以借助WinRM服务。

创建虚拟机

创建虚拟机时,默认会打开网关防火墙上PowerShell远程管理的私有端口5986和公有端口5986,你可以出于安全考虑将公有端口改成自己的端口(我暂时改成了65331)

创建虚拟机,打开PowerShell端口
创建虚拟机,打开PowerShell端口

在Azure 门户上配置虚拟机

假如你创建时没有配置或者不小心删除了,在虚拟机创建后,也可以在Azure门户上来配置。

配置虚拟机,打开PowerShell端口
配置虚拟机,打开PowerShell端口

服务器端的配置

开启WinRM服务

通过远程桌面连接到服务器(Azure VM)上面,以管理员权限打开PowerShell控制台,运行下面命令:

PS I:\> Enable-PSRemoting

WinRM 快速配置
正在运行命令“Set-WSManQuickConfig”,以便通过 Windows 远程管理(WinRM)服务对该计算机进行远程管理。
 其中包括:
    1. 启动或重新启动(如果已启动) WinRM 服务
    2. 将 WinRM 服务启动类型设置为“自动”
    3. 创建侦听程序以接受任意 IP 地址上的请求
    4. 为 WS-Management 通信启用 Windows 防火墙入站规则例外(仅适用于 http)。

是否继续?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): Y
WinRM 已更新为接收请求。
成功更改 WinRM 服务类型。
已启动 WinRM 服务。

WinRM 已经进行了更新,以用于远程管理。
在 HTTP://* 上创建 WinRM 侦听程序接受 WS-Man 对此机器上任意 IP 的请求。
WinRM 防火墙异常已启用。
已配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。

确认
是否确实要执行此操作?
正在目标“名称: microsoft.powershell SDDL:
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。这允许选定的用户在此计算机上远程运行 Windows
PowerShell 命令。”上执行操作“Set-PSSessionConfiguration”。
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): Y

确认
是否确实要执行此操作?
正在目标“名称: microsoft.powershell.workflow SDDL:
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。这允许选定的用户在此计算机上远程运行 Windows
PowerShell 命令。”上执行操作“Set-PSSessionConfiguration”。
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): Y

确认
是否确实要执行此操作?
正在目标“名称: microsoft.powershell32 SDDL:
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。这允许选定的用户在此计算机上远程运行 Windows
PowerShell 命令。”上执行操作“Set-PSSessionConfiguration”。
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): Y

配置WinRM使用HTTPS连接

Azure上面的机器位于公网Cloud上面,一般不会加入域,PowerShell远程跨域访问为了安全须要使用HTTPS连接,在服务器上配置让RinRM服务只允许使用HTTPS连接。

winrm quickconfig -transport:https

客户端的配置

先使用下面的命令从客户端建立起一个会话:

New-PSSession -ComputerName pstips.cloudapp.net -Port 65331 -UseSSL -Credential (Get-Credential)

可能会碰到下面的错误:

New-PSSession : [pstips.cloudapp.net] 连接到远程服务器 pstips.cloudapp.net 失败,并显示以下错误消息: 目标计算机(pstips.cloudapp.net:65331)上的服务器证书包含以下错误: SSL 证书由未知的证书颁发机构签名。 有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。

导入证书

上面的错误非常详细,Cloud上面的机器使用的是自签名证书,须要将该证书导入你客户端的证书存储区:证书->当前用户->受信任的根证书颁发机构。

获取自签名证书

问题来了,如何获取这个自签名证书呢?方法可能很多,我选择用浏览器,使用谷歌浏览器chrome,访问:

https://pstips.cloudapp.net:65331

然后显示该”网站的证书不受信任“,单击地址栏的https锁,弹出证书信息。选择连接选项卡,单击证书信息,弹出“证书信息”对话框,选择“详细信息”选项卡,单击“复制到文件”按钮,将证书保存至本地文件。然后导入证书至受信任的根证书颁发机构,即可。

从浏览器保存自签名证书
从浏览器保存自签名证书

完了以后再使用PowerShell尝试建立远程会话,然后执行命令。

PS> New-PSSession -ComputerName pstips.cloudapp.net -Port 65331 -UseSSL -Credential (Get-Credential)

位于命令管道位置 1 的 cmdlet Get-Credential
请为以下参数提供值:
Credential

 Id Name            ComputerName    State         ConfigurationName     Availability
 -- ----            ------------    -----         -----------------     ------------
  2 Session2        pstips......... Opened        Microsoft.PowerShell     Available
PS> $session = Get-PSSession -Id 2
PS> Invoke-Command -Session $session -ScriptBlock { Get-Service spooler}

Status   Name               DisplayName                            PSComputerName
------   ----               -----------                            --------------
Running  spooler            Print Spooler                          pstips.cloudapp.net

恭喜,此服务器已被占领。

本文链接: https://www.pstips.net/remote-manage-vm-hosted-on-windows-azure.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

9 条评论 “PowerShell 远程管理Windows Azure 上面的虚拟机

  • zhgj007

    您好!这个网站对我很有帮助,非常感谢。有个实践中遇到问题请教。
    最近按照这篇文章提示配置PowerShell 远程管理Windows Azure,执行到“配置WinRM使用HTTPS连接”中的“winrm quickconfig -transport:https”遇到问题,反馈信息如下:

    WinRM service is already running on this machine.
    WSManFault
        Message
            ProviderFault
                WSManFault
                    Message = Cannot create a WinRM listener on HTTPS because this machine does not have an appropriate cert
    ificate. To be used for SSL, a certificate must have a CN matching the hostname, be appropriate for Server Authenticatio
    n, and not be expired, revoked, or self-signed.
    Error number:  -2144108267 0x80338115
    Cannot create a WinRM listener on HTTPS because this machine does not have an appropriate certificate. To be used for SS
    L, a certificate must have a CN matching the hostname, be appropriate for Server Authentication, and not be expired, rev
    oked, or self-signed.
    

    应该是Azure VM上的证书不匹配所致。
    其后用winrm e winrm/config/listener查看,返回:

    PS C:\Windows\system32> winrm e winrm/config/listener
    Listener
        Address = *
        Transport = HTTP
        Port = 5985
        Hostname
        Enabled = true
        URLPrefix = wsman
        CertificateThumbprint
        ListeningOn = ******,
    

    Azure网关中这台VM已经有***.cloudapp.net的dns name,hostname显示为***,
    我现在疑惑的是WinRM中https证书所需CN对应的hostname究竟对应Azure网关的dns name还是hostname,
    还是“ winrm e winrm/config/listener”查看返回 Hostname下的空内容?

    • zhgj007

      补充一下问题,在VM的PS中敲hostname,显示是***,同Azure网关对应VM的hostname一致。
      又用MMC查看了一下VM上本地计算机安装的证书,个人证书目录下有***.cloudapp.net证书,可显示不被信任,
      将其挪到根目录证书下,状态改为信任,可是“winrm quickconfig -transport:https”仍然报错。
      请问是否该自行创建hostname证书,比如pstips.cloudapp.net的dns name,就得另外创建一个pstips证书?

    • Mooser Lee 文章作者
      $cred=Get-Credential
      
      #或者
      function New-Credential([string]$user,[string]$password)
      {
          $secuStr =  ConvertTo-SecureString -String $password -AsPlainText -Force
          New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $user,$secuStr
      }
      $cred=New-Credential -user 'pstips.net/mosserlee' -password 'hellow'