This is another quick fix to help automate a somewhat monotonous task, this time it’s using Powershell to build a simple menu to give the ability to start and stop a set of Azure virtual machines using a Service Principal.
The script is pretty straight forward and can be easily adapted to add additional VM’s should you need to power up, or down, a larger set of virtual machines.
# This script creates a Service Principal within Azure AD # Install and import AzureAD PS Module Install-Module AzureAD Install-Module AzureAD # Connect to Azure AD with a Global Admin account. $aadContext = Connect-AzureAD # Create Service Principal $svcPrincipal = New-AzureADApplication -AvailableToOtherTenants $true -DisplayName "VM Power Menu Service Principal" # Get Service Principal ID and Key $svcPrincipalCreds = New-AzureADApplicationPasswordCredential -ObjectId $svcPrincipal.ObjectId # Return Service Principal App ID $svcPrincipal.AppId # Return Service Principal Secret Key $svcPrincipalCreds.Value # Return Azure AD Tenant ID $aadContext.TenantId.Guid
Before proceeding please ensure that the newly created Service Principal has the adequate permissions to start and stop the required virtual machines, this can be set directly on the VM’s themselves or on the Resource Group.
Note, if you’re setting these permissions in a production environment or an environment that is particularly security-sensitive please be mindful of the principle of least privileges, that is, avoid using elevated roles such as Owner or Contributor role if a lesser role would suffice, such as Virtual Machine Contributor.
Once the Service Principal has been created copy and paste the below into your code editor of choice, you will need to set the initial variables in the header, you can use the resultant output from the script above for the Azure AD Tenant ID and Service Principal details. You will also need to populate the two Azure VM variables and the associated hosting Resource Group.
Import-Module Az.Compute $AADTenant = [Azure-AD-Tenant-ID-Here] $SPAppID = [Service-Principal-App-ID] $SPAppSecret = [Service-Principal-Secret-Key-Here] $WVDVM1 = [Second-VM-To Start] $WVVM2 = [Second-VM-To Start] $AzRG = [Resource-Group-Hosting-VMs-Here] $passwd = ConvertTo-SecureString $SPAppSecret -AsPlainText -Force $pscredential = New-Object System.Management.Automation.PSCredential('$SPAppID', $passwd) Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $AADTenant function Show-Menu { param ( [string]$Title = 'Start-Stop WVD Lab' ) cls Write-Host "================ $Title ================" Write-Host "1: Press '1' to start WVD." Write-Host "2: Press '2' to stop WVD." Write-Host "Q: Press 'Q' to quit." } do { Show-Menu $input = Read-Host "Please make a selection" switch ($input) { '1' { cls 'Starting WVD' Start-AzVM -Name $WVDVM1 -ResourceGroupName $AzRG Start-AzVM -Name $WVDWM2 -ResourceGroupName $AzRG } '2' { cls 'Stopping WVD' Stop-AzVM -Name $WVDVM1 -ResourceGroupName $AzRG -Force Stop-AzVM -Name $WVDWM2 -ResourceGroupName $AzRG -Force } 'q' { return } } #pause } until ($input -eq 'q')
When executed the script presents a simple menu with 3 choices as below.
Note, after executing either options 1 or 2 the script will intentionally not exit and close, instead, it will await a response of Q to quit – this was done intentionally as a gentle reminder to the user to stop the VM’s they’d originally started.
Lastly, as a matter of good practice, for lab environments that don’t need to spin around the clock, for subscriptions that use free credit, or you’re just trying to keep costs down I’d always recommend setting an Auto-Shutdown time on non-production VM’s as a backup.
One thought on “QuickFix > Starting and Stopping Azure VM’s using a Powershell Menu”