A: The process was provided by one of the customers (Richard Knott from Ascertus):
It utilizes CustomScriptExtension
Classic cmdlet: https://docs.microsoft.com/en-us/azure/virtual-machines/virtual-machines-windows-extensions-customscript
First the PowerShell script needs to be uploaded to blob storage. This is from a script we use that generates a windows Open File Dialog, and allows the user to select the storage account etc. The Azure Portal also gives a UI for deploying:
$file = Get-ChildItem $OpenFileDialog.FileName Set-AzureStorageBlobContent -Blob $file.Name -Container $ContainerName -File $OpenFileDialog.FileName -Context $StorageContex -Force
Then the script needs to be passed to the VM. This is from our script that loops though all the VM’s in a Subscription, so we’ve already got the VM object:
Set-AzureVMCustomScriptExtension -ContainerName $ContainerName -StorageAccountName $StorageAccountName -FileName $file.Name -VM $AzureVMObject | Update-AzureVM -Verbose
-- Note: Similar Powershell cmdlet is available for ARM machines: Set-AzureRmVMCustomScriptExtension
We used these to deploy a Powershell module for deploying windows Updates.
And here’s the actual script that runs on the machine (we also have some logging which I’ve excluded):
#Setup variables
$directoryPath= “C:\Packages\CloudMonixWindowsAgent”
$zipfile=“C:\Packages\CloudMonixWindowsAgent.zip”
$source="http://server/installs/_Standard/CloudMonixWindowsAgent.zip"
#check if already downloaded
if ((Test-Path $zipfile) -eq $false)
{
try{
(Get-Date -Format "yyyy-MM-dd HH:mm:ss") +" getting " +$source | Out-File $LogFile -Append -Force
$wc = New-Object System.Net.WebClient
#if you need to add credetials
$wc.Credentials = new-object System.Net.NetworkCredential("username", "password", "domain")
$wc.DownloadFile($source, $zipfile)
}
catch
{
#error handleing
(Get-Date -Format "yyyy-MM-dd HH:mm:ss") +" ERROR " + $_.Exception.Message + ":" + $_.Exception.ItemName | Out-File $LogFile -Append -Force
}
}
#create unzip folder
If ((Test-Path $directoryPath) -eq $False)
{
md $directoryPath
}
#unzip
$shell = new-object -com shell.application
$zip = $shell.NameSpace($zipfile)
foreach($item in $zip.items())
{
$shell.Namespace($directoryPath).copyhere($item)
}
#install
start-process $directoryPath\install.cmd -WorkingDirectory $directoryPath -Wait