2017-09-25 78 views
1

我需要以域管理員的身份自動執行目標VM上的腳本。問題是,虛擬機沒有公開。我也不應該重寫腳本,因爲它是由團隊成員編寫的,我寧願爲我的團隊提供適用於他們的解決方案,並且是自動化的,而不是每次都重寫它們的腳本。 當前進程看起來像THI從VSTS通過Azure PowerShell腳本到目標VM上的PowerShell腳本的雙跳憑證

  1. VSTS啓動與Azure的PowerShell腳本command1.ps1構建過程
  2. Command1.ps1目標安裝Azure的自定義腳本擴展VM
  3. 自定義腳本擴展下載並執行命令2名爲.ps1運行command3.ps1以域管理員

我遇到的問題是我無法從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地址

我確定有這樣做的更好的方法。 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 

回答

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 

並粘貼相應的params into第二個腳本(所以它接受這些)

另外,您不需要中間腳本,您可以下載"https://raw.githubusercontent.com/x/command2.ps1"並使用參數執行它

+0

您是否打算通過Azure自定義擴展從VSTS傳遞純文本密碼?我不認爲這是個好主意。密碼在C:\ Packages \ Plugins \ Microsoft.Compute.CustomScriptExtension \ 1.9 \ RuntimeSettings \ 0.settings – WinBoss

+0

中顯示爲純文本,之後您將刪除擴展名,所以並不重要。那個地方會被清理乾淨。或者你可以使用受保護的設置,執行的命令將被編碼。 https://docs.microsoft.com/en-us/azure/virtual-machines/windows/extensions-customscript – 4c74356b41

+0

使用PowerShell傳遞受保護設置的任何方式?如果不是,你會怎麼做?你覺得安全通過密碼作爲簡單的字符串? – WinBoss