Repair-AzVM.psm1

#### BEGIN CONSTANTS ####

#### END CONSTANTS ####

#### BEGIN FUNCTIONS ####

function Repair-AzVM
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,
            HelpMessage='Name of the Problem VM.')]
        [String] $VMname,

        [Parameter(Mandatory=$true, 
            HelpMessage='RG of the Problem VM')]
        [String] $RGname
    )
    try
    {
        $vm = Get-AzVM -ResourceGroupName $RGname -Name $VMname
        $diskname = $vm.StorageProfile.OsDisk.Name
        $disk = Get-AzDisk | ? {$_.Name -eq $diskname}
        $rvmName = 'Repair-VM'+(Get-Random -Maximum 100)
        $RrgName = 'Repair-VM-RG'+(Get-Random -Maximum 100)
        $vnet = ('Rep-'+$VMname+'-vnet').Trim()
        $nsg = ('Rep-'+$VMname+'-NSG').Trim()
        $pip =('Rep-'+$VMname+'-pip').Trim()
        $location = $vm.Location
        $encryption = $disk.EncryptionSettingsCollection.Enabled

#encryption check
if($encryption -eq $true){
        $keyurl = $disk.EncryptionSettingsCollection.EncryptionSettings.KeyEncryptionKey.KeyUrl
        $secret = $disk.EncryptionSettingsCollection.EncryptionSettings.DiskEncryptionKey.SecretUrl
        Write-Host "The VM is encrypted. the disk will be unlocked at the target" -ForegroundColor Yellow
        }else{
        Write-Host "No encryption proceeding with Repair VM creation" -ForegroundColor Green
        }

#create Repaair VM
    $create = New-AzVm `
    -ResourceGroupName $RrgName `
    -Name $rvmName `
    -Location $location `
    -VirtualNetworkName $vnet `
    -SubnetName "default" `
    -SecurityGroupName $nsg `
    -PublicIpAddressName $pip `
    -OpenPorts 3389 -Size Standard_D4s_v3

Write-Host "Repair VM is created" -ForegroundColor Green
Write-Host "Attaching the faulty disk..." -ForegroundColor Yellow

#get OS disk & create copy
    $newdiskname = $vmname+'-osdisk'+(Get-Random -Maximum 100)
    $diskConfig = New-AzDiskConfig -SourceResourceId $disk.Id -Location $disk.Location -CreateOption Copy 
    $newdiskcreate = New-AzDisk -Disk $diskConfig -DiskName $newdiskname -ResourceGroupName $RGname -WarningAction SilentlyContinue
    
#Attach to repair VM
    $rvm = Get-AzVM -Name $rvmName -ResourceGroupName $RrgName
    $rvm = Add-AzVMDataDisk -VM $rvm -CreateOption Attach -ManagedDiskId $newdiskcreate.Id -Lun 1
    Update-AzVM -VM $rvm -ResourceGroupName $RrgName
    Write-Host "Faulty disk attached" -ForegroundColor Green

#unlocking the disk if encrypted
if($encryption -eq $true){
$vault = ($keyurl.Split('/')[2]).split('.')[0]
$KeyVault = Get-AzKeyVault | ? {$_.Vaultname -eq $vault}
$getvault = Get-AzKeyVault -VaultName $vault -ResourceGroupName $KeyVault.ResourceGroupName
Write-Host "Unlocking disk,Please wait" -ForegroundColor Yellow
$encrypt = Set-AzVMDiskEncryptionExtension -ResourceGroupName $RrgName -VMName $rvmName -DiskEncryptionKeyVaultUrl $getVault.VaultUri -DiskEncryptionKeyVaultId $getvault.ResourceId -VolumeType All -Force
Write-Host "Disk Unlocked" -ForegroundColor Green
Start-Sleep -Seconds 20
}else{
Write-Host "Skipping encryption" -ForegroundColor Yellow}


#Enable Hyper-V
    Write-Host "Final Step, Enabling Hyper-V on $rvmName" -ForegroundColor Yellow
    $fileUri = @("https://120061622000248sr.blob.core.windows.net/script/install.ps1")
    $settings = @{"fileUris" = $fileUri};
    $protectedSettings = @{"commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File install.ps1"};
    $cse = Set-AzVMExtension -ResourceGroupName $rvm.ResourceGroupName `
    -Location $rvm.Location `
    -VMName $rvm.Name `
    -Name "enablehyperv" `
    -Publisher "Microsoft.Compute" `
    -ExtensionType "CustomScriptExtension" `
    -TypeHandlerVersion "1.10" `
    -Settings $settings    `
    -ProtectedSettings $protectedSettings

Write-Host "Hyper-V enabled & restarted, please wait until the VM is back online" -ForegroundColor Green
Start-Sleep -Seconds 20
Write-Host "Repair VM $rvmName is ready now" -ForegroundColor Green

}
        catch
    {
        throw
    }
    finally
    {

    }
}
Export-ModuleMember -Function Repair-AzVM
#### END FUNCTIONS ####