This page contains Windows bias

About This Page

This page is part of the Azure documentation. It contains code examples and configuration instructions for working with Azure services.

Bias Analysis

Bias Types:
⚠️ powershell_heavy
⚠️ windows_first
⚠️ missing_linux_example
⚠️ windows_tools
Summary:
The documentation page demonstrates a strong Windows bias. All deployment and cleanup examples are provided exclusively in PowerShell, with no Azure CLI (bash) or Linux-native shell examples. The Bicep template provisions only Windows VMs, with no mention of Linux VM options or parameters. References to tools and workflows (such as 'right-click to paste' and PowerShell cmdlets) are Windows-centric, and there is no guidance for users on Linux or macOS platforms.
Recommendations:
  • Add Azure CLI (bash) examples for deploying the Bicep template, including equivalent commands for parameter input and resource group deployment.
  • Provide a Linux VM option in the Bicep template, such as an additional parameter for selecting between Windows and Linux images, and document the allowed values.
  • Include cleanup instructions using Azure CLI commands, not just PowerShell.
  • Mention cross-platform compatibility of Azure Cloud Shell, and provide instructions for both bash and PowerShell environments.
  • Update references to input methods (e.g., pasting in Cloud Shell) to be platform-neutral.
  • Link to Linux-specific quickstarts or tutorials for VM backup with Bicep where available.
GitHub Create pull request

Scan History

Date Scan ID Status Bias Status
2025-07-12 23:44 #41 in_progress ❌ Biased
2025-07-12 00:58 #8 cancelled ✅ Clean
2025-07-10 05:06 #7 processing ✅ Clean

Flagged Code Snippets

@description('Specifies a name for generating resource names.') @maxLength(8) param projectName string @description('Specifies the location for all resources.') param location string = resourceGroup().location @description('Specifies the administrator username for the Virtual Machine.') param adminUsername string @description('Specifies the administrator password for the Virtual Machine.') @secure() param adminPassword string @description('Specifies the unique DNS Name for the Public IP used to access the Virtual Machine.') param dnsLabelPrefix string @description('Virtual machine size.') param vmSize string = 'Standard_A2' @description('Specifies the Windows version for the VM. This will pick a fully patched image of this given Windows version.') @allowed([ '2008-R2-SP1' '2012-Datacenter' '2012-R2-Datacenter' '2016-Nano-Server' '2016-Datacenter-with-Containers' '2016-Datacenter' '2019-Datacenter' '2019-Datacenter-Core' '2019-Datacenter-Core-smalldisk' '2019-Datacenter-Core-with-Containers' '2019-Datacenter-Core-with-Containers-smalldisk' '2019-Datacenter-smalldisk' '2019-Datacenter-with-Containers' '2019-Datacenter-with-Containers-smalldisk' ]) param windowsOSVersion string = '2016-Datacenter' var storageAccountName = '${projectName}store' var networkInterfaceName = '${projectName}-nic' var vNetAddressPrefix = '10.0.0.0/16' var vNetSubnetName = 'default' var vNetSubnetAddressPrefix = '10.0.0.0/24' var publicIPAddressName = '${projectName}-ip' var vmName = '${projectName}-vm' var vNetName = '${projectName}-vnet' var vaultName = '${projectName}-vault' var backupFabric = 'Azure' var backupPolicyName = 'DefaultPolicy' var protectionContainer = 'iaasvmcontainer;iaasvmcontainerv2;${resourceGroup().name};${vmName}' var protectedItem = 'vm;iaasvmcontainerv2;${resourceGroup().name};${vmName}' var networkSecurityGroupName = 'default-NSG' resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = { name: storageAccountName location: location sku: { name: 'Standard_LRS' } kind: 'Storage' properties: {} } resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2020-06-01' = { name: publicIPAddressName location: location properties: { publicIPAllocationMethod: 'Dynamic' dnsSettings: { domainNameLabel: dnsLabelPrefix } } } resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2020-06-01' = { name: networkSecurityGroupName location: location properties: { securityRules: [ { name: 'default-allow-3389' properties: { priority: 1000 access: 'Allow' direction: 'Inbound' destinationPortRange: '3389' protocol: 'Tcp' sourceAddressPrefix: '*' sourcePortRange: '*' destinationAddressPrefix: '*' } } ] } } resource vNet 'Microsoft.Network/virtualNetworks@2020-06-01' = { name: vNetName location: location properties: { addressSpace: { addressPrefixes: [ vNetAddressPrefix ] } subnets: [ { name: vNetSubnetName properties: { addressPrefix: vNetSubnetAddressPrefix networkSecurityGroup: { id: networkSecurityGroup.id } } } ] } } resource networkInterface 'Microsoft.Network/networkInterfaces@2020-06-01' = { name: networkInterfaceName location: location properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { privateIPAllocationMethod: 'Dynamic' publicIPAddress: { id: publicIPAddress.id } subnet: { id: '${vNet.id}/subnets/${vNetSubnetName}' } } } ] } } resource virtualMachine 'Microsoft.Compute/virtualMachines@2020-06-01' = { name: vmName location: location properties: { hardwareProfile: { vmSize: vmSize } osProfile: { computerName: vmName adminUsername: adminUsername adminPassword: adminPassword } storageProfile: { imageReference: { publisher: 'MicrosoftWindowsServer' offer: 'WindowsServer' sku: windowsOSVersion version: 'latest' } osDisk: { createOption: 'FromImage' } dataDisks: [ { diskSizeGB: 1023 lun: 0 createOption: 'Empty' } ] } networkProfile: { networkInterfaces: [ { id: networkInterface.id } ] } diagnosticsProfile: { bootDiagnostics: { enabled: true storageUri: storageAccount.properties.primaryEndpoints.blob } } } } resource recoveryServicesVault 'Microsoft.RecoveryServices/vaults@2020-02-02' = { name: vaultName location: location sku: { name: 'RS0' tier: 'Standard' } properties: {} } resource vaultName_backupFabric_protectionContainer_protectedItem 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems@2020-02-02' = { name: '${vaultName}/${backupFabric}/${protectionContainer}/${protectedItem}' properties: { protectedItemType: 'Microsoft.Compute/virtualMachines' policyId: '${recoveryServicesVault.id}/backupPolicies/${backupPolicyName}' sourceResourceId: virtualMachine.id } }
## Validate the deployment ### Start a backup job The template creates a VM and enables backup on the VM. After you deploy the template, you need to start a backup job. For more information, see [Start a backup job](quick-backup-vm-powershell.md#start-a-backup-job). ### Monitor the backup job To monitor the backup job, see [Monitor the backup job](quick-backup-vm-powershell.md#monitor-the-backup-job). ## Clean up resources - If you no longer need to back up the VM, you can clean it up. - To try out restoring the VM, skip the clean-up process. - If you've used an existing VM, you can skip the final [Remove-AzResourceGroup](/powershell/module/az.resources/remove-azresourcegroup) cmdlet to keep the resource group and VM. Follow these steps: 1. Disable protection, remove the restore points and vault. 1. Delete the resource group and associated VM resources, as follows: