【问题标题】:Powershell on target machines from azure pipelines来自 Azure 管道的目标计算机上的 Powershell
【发布时间】:2019-11-24 17:22:44
【问题描述】:

我有一个 Azure VM,我想从 azure 管道远程运行一些 powershell 命令。我使用自签名证书在我的 VM 上设置了 winrm,并在 VM azure 防火墙上打开了端口 5986。我已经能够从本地机器远程执行一些我放在 VM 中的脚本,但是当我从 Powershell 对目标机器任务执行相同的脚本时,我会收到拒绝访问错误。

我也尝试了 v2 任务并勾选测试证书并使用我用来 rdp 到机器的管理员帐户,但得到了同样的错误。我想知道我在设置这个时错过了什么?

【问题讨论】:

  • 你的 Azure 虚拟机有公共 IP 吗?

标签: azure azure-devops virtual-machine


【解决方案1】:

首先测试您可以让 Powershell 从笔记本电脑或其他机器在您的目标上远程执行。

使用下面的 Powershell 脚本测试您的 WinRM 连接和自签名证书,并注意测试 Powershell 脚本中的 -SkipCNCheck -SkipCACheck PSSession 选项。如果您使用的是自签名证书,这些选项是必不可少的,并且您还需要在“在目标机器上运行 Powershell”模板(版本 3)的“会话选项”中提供相同的开关。

注意:我使用本地主机 IP 只是为了避免意外使用真实 IP

$password = ConvertTo-SecureString 'password goes here' -AsPlainText -Force

$credential = New-Object System.Management.Automation.PSCredential ('yourDomain\yourDomainUserId', $password)

$sessionOptions = New-PSSessionOption -SkipCNCheck -SkipCACheck

$remote_session = new-pssession -computername 127.0.0.1 -UseSSL -credential $credential -SessionOption $sessionOptions

Invoke-Command -session $remote_session -ScriptBlock { Get-Culture }

还请确保您已设置 WinRM 侦听器以侦听目标计算机的 外部 IP,并向该侦听器注册自签名证书指纹。使用 WinRM 命令执行此操作(使用您的实际外部公共 IP),例如:

winrm create winrm/config/Listener?Address=IP:127.0.0.1+Transport=HTTPS @{Hostname="some.hostname.outhere.net"; CertificateThumbprint="[YOUR CERT THUMBPRINT]ABCDEF0247283798137030174027"}

另外请注意,在“在目标机器上运行 Powershell”模板的“机器”字段中,使用机器外部公共 IP 代替 FQDN 或 DNS 名称。如果您使用的是自签名证书,则必须这样做。

一旦您获得测试 Powershell 脚本以使用远程计算机上的自签名证书进行连接和握手,您几乎可以保证“在目标计算机上运行 Powershell”也能正常工作。

其他需要检查的事项:

  • 确保您已使用通配符“*”作为服务器名称或 ip 设置 TrustedHosts。基本连接正常工作后,您可以返回并微调您的安全性。

  • 您可能需要域级 GPO 以允许 WinRM 服务不受阻碍地运行,具体取决于您的目标计算机是工作站还是加入域的计算机。

如果一切都失败了,请在您的目标机器上下载并安装 Wireshark 并设置一个 ip 过滤器以仅侦听客户端服务器的 ip 并分析流量,大多数情况下这会提示您什么被拒绝和为什么。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    为 Microsoft Azure 虚拟机设置 WinRM。

    Azure 虚拟机需要 WinRM 才能使用 HTTPS 协议。你 可以使用自签名测试证书。在这种情况下,自动化 代理不会验证证书的真实性 由受信任的证书颁发机构颁发。

    根据您的描述,如果您能够使用管理员帐户 rdp 到机器。

    构建服务帐户只是在管道的目标计算机任务上运行 Powershell。建议您也可以使用您的构建服务帐户来远程您的 Azure VM 并运行脚本。这将缩小问题的范围。

    如果构建服务帐户也出现访问被拒绝错误。您需要为构建服务帐户分配相应的权限,请参阅您的管理员帐户。

    此外,如果您的 Azure VM 没有公共 IP,请在此处参考此类似问题:Use VSTS task 'PowerShell on Target Machines' without public IP in Azure

    【讨论】:

    • 是的,我的 vm 有一个公共 ip,我也为它分配了一个 dns。关于构建服务帐户,我如何获得它(它的 azure devops)?但是,任务不应该使用我在任务设置中设置的管理员帐户和密码来建立远程连接吗?
    • @DavidBL 您正在使用 Azure DevOps Service 或 Azure DevOps Server。构建服务帐户正在运行管道。有关如何检查 Azure DevOps 服务的构建服务帐户,请参阅我更新答案中的屏幕截图。该任务不应该使用我在任务设置中设置的管理员帐户和密码来建立远程连接吗?不,对于管道中的任务,构建服务帐户正在运行它以连接 azure 中的远程 VM
    【解决方案3】:

    如果 .Netcore 在您的 VM 上,这可能对您没有帮助,但我们通过创建具有 http 请求功能的轻型 .Netcore Worker 服务解决了无法使用提升的 Powershell 命令的问题。您可以从常规 Powershell YML 任务发送 Invoke-RestMethod 命令,它会在 ASP 控制器的另一端触发您的自定义逻辑。我们使用它在重新安装我们的单元测试之前删除 Appx 包。仓库位于AzureAdmin

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2017-06-26
      • 2019-01-16
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多