从VSTS到Azure PowerShell脚本到目标VM上的PowerShell脚本的双重跳过凭据

时间:2017-09-25 16:28:49

标签: powershell azure azure-devops azure-powershell

我需要作为域管理员自动执行目标VM上的脚本。问题是,虚拟机没有公开。我也不应该重写脚本,因为它是由团队成员编写的,我宁愿为我的团队提供适合他们的解决方案,并且可以自动化,而不是每次都重写他们的脚本。 目前的流程看起来像是

  1. VSTS使用Azure PowerShell脚本command1.ps1
  2. 启动构建过程
  3. Command1.ps1在目标VM上安装Azure自定义脚本扩展
  4. 自定义脚本扩展名下载并执行将command3.ps1作为域管理员运行的command2.ps1
  5. 我遇到的问题是我无法将凭据从VSTS传递到command2.ps1 请推荐我如何正确地做到这一点。 我找到的选项:

    1. 不确定是否可以使用VSTS https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

    2. 将IP公共地址添加到目标VM,配置WinRM,执行command2.ps1,删除公共IP地址

    3. 我确信有更好的方法可以做到这一点。 command1.ps1:

          param
      (
          [Parameter(Mandatory)]
          [String]$resourceGroupName,
      
          [Parameter(Mandatory)]
          [String]$targetVMname,
      
          [Parameter(Mandatory)]
          [String]$vmLocation,
      
          [Parameter(Mandatory)]
          [String]$FileUri,
      
          [Parameter(Mandatory)]
          [String]$nameOfTheScriptToRun,
      
          [Parameter(Mandatory)]
          [String]$customScriptExtensionName,
      
          [Parameter(Mandatory)]
          [String]$domainAdminName,
      
          [Parameter(Mandatory)]
          [String]$domainAdminPassword
      
      )
      
      $domainAdminPasswordSecureString = ConvertTo-SecureString -String $domainAdminPassword -AsPlainText -Force
      $DomainCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $domainAdminName, $domainAdminPasswordSecureString
      
      Set-AzureRmVMCustomScriptExtension -Argument "-DomainCredentials $DomainCredentials" `
          -ResourceGroupName $resourceGroupName `
          -VMName $targetVMname `
          -Location $vmLocation `
          -FileUri $FileUri `
          -Run $nameOfTheScriptToRun `
          -Name $customScriptExtensionName
      
      Remove-AzureRmVMCustomScriptExtension -Force `
          -ResourceGroupName $resourceGroupName `
          -VMName $targetVMname `
          -Name $customScriptExtensionName
      

      command2.ps1:

          param
      (
          [Parameter(Mandatory)]
          [System.Management.Automation.PSCredential]$DomainCredentials
      )
      
      $url = "https://raw.githubusercontent.com/x/command2.ps1"
      $output = "C:\command2.ps1"
      
      Invoke-WebRequest -Uri $url -OutFile $output
      Start-Process -FilePath powershell.exe -ArgumentList $output -Credential $DomainCredentials
      

1 个答案:

答案 0 :(得分:3)

您实际上没有双跳问题,因为您没有在节点上执行命令,而是启动扩展,下载脚本并执行它。

所以你需要做的是:

Set-AzureRMVMCustomScriptExtension ... -Argument "-domainAdminName admin -domainAdminPassword passw0rD" -VM $Vm
$vm | Update-AzureVM

并在您的脚本中(在机器内部调用,所以command2.ps1)执行:

$domainAdminPasswordSecureString = ConvertTo-SecureString -String $domainAdminPassword -AsPlainText -Force
$DomainCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $domainAdminName, $domainAdminPasswordSecureString

并将相应的参数粘贴到第二个脚本中(因此它接受这些参数)

此外,您不需要中间脚本,只需下载"https://raw.githubusercontent.com/x/command2.ps1"并使用参数执行