J'ai besoin d'automatiser l'exécution des scripts sur les machines virtuelles cibles en tant qu'administrateur de domaine. Le problème est, les machines virtuelles n'ont pas de public. Je ne devrais pas non plus réécrire le script tel qu'il a été écrit par un membre de l'équipe et je préfère fournir à mon équipe une solution qui fonctionne pour eux et qui est automatisable, au lieu de réécrire leurs scripts à chaque fois. Le processus actuel ressemble thiInformations d'authentification double saut de VSTS via le script Azure PowerShell au script PowerShell sur la machine virtuelle cible
- VSTS initie un processus de construction avec Azure scripts PowerShell command1.ps1
- Command1.ps1 installe Azure personnalisée Extension Script sur la cible VM
- téléchargements d'extension de script personnalisé et exécute commande2 .ps1 qui exécute command3.ps1 en tant qu'administrateur de domaine
Le problème que je vais avoir est que je suis incapable de passer les informations d'identification de VSTS à command2.ps1 S'il vous plaît, me recommander comment je dois faire e à correctement. Les options que je trouve:
Je ne sais pas s'il est possible avec VSTS https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/
Ajouter une adresse IP publique à la cible VM, configurer WinRM, exécutez command2.ps1, supprimer l'adresse IP publique
Je suis sûr qu'il existe une meilleure façon de procéder. 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
Souhaitez-vous transmettre un mot de passe en texte brut à partir de VSTS via Azure Custom Extension? Je ne pense pas que ce soit une bonne idée. Le mot de passe sera visible en tant que texte brut dans C: \ Packages \ Plugins \ Microsoft.Compute.CustomScriptExtension \ 1.9 \ RuntimeSettings \ 0.settings – WinBoss
vous supprimez l'extension par la suite, donc n'a pas vraiment d'importance. cet endroit sera nettoyé. Ou vous pouvez utiliser des paramètres protégés et la commande à exécuter sera codée. https://docs.microsoft.com/en-us/azure/virtual-machines/windows/extensions-customscript – 4c74356b41
Un moyen de transmettre des paramètres protégés avec PowerShell? Sinon, que feriez-vous? Seriez-vous sûr de passer le mot de passe comme une simple chaîne? – WinBoss