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,
    
        [Parameter(Mandatory=$false)]
        [Validateset('Win2012R2Datacenter','Win2016Datacenter','Win2019Datacenter')]
        [string]$OSVersion = "Win2019Datacenter"
    )
    try
    {
        $StartTime = $(get-date)
        $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
        $elapsedTime = $(get-date) - $StartTime
        $total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
if($encryption -eq $true){
        $keyurl = $disk.EncryptionSettingsCollection.EncryptionSettings.KeyEncryptionKey.KeyUrl
        $secret = $disk.EncryptionSettingsCollection.EncryptionSettings.DiskEncryptionKey.SecretUrl
        $fileuri = @("https://120061622000248sr.blob.core.windows.net/encrypted/install.ps1")
        $finaloutput = "Hyper-V enabled,Unlocking disk now & VM will be restarted later"
        Write-Host "$total The VM is encrypted. the disk will be unlocked at the target" -ForegroundColor Yellow
        }else{
        $fileuri = @("https://120061622000248sr.blob.core.windows.net/script/install.ps1")
        $finaloutput = "Hyper-V enabled & restarted, please wait until the VM is back online"
        Write-Host "$total 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 -Image $OSVersion
$elapsedTime = $(get-date) - $StartTime
$total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
Write-Host "$total Repair VM is created" -ForegroundColor Green
Write-Host "$total 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
    $elapsedTime = $(get-date) - $StartTime
    $total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
    Write-Host "$total Faulty disk attached" -ForegroundColor Green

#Enable Hyper-V
    Write-Host "$total Enabling Hyper-V on $rvmName" -ForegroundColor Yellow
    $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

$elapsedTime = $(get-date) - $StartTime
$total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
Write-Host "$total $finaloutput" -ForegroundColor Green
if($encryption -eq $true){
$vault = ($keyurl.Split('/')[2]).split('.')[0]
$KeyVault = Get-AzKeyVault | ? {$_.Vaultname -eq $vault}
$getvault = Get-AzKeyVault -VaultName $vault -ResourceGroupName $KeyVault.ResourceGroupName
$encrypt = Set-AzVMDiskEncryptionExtension -ResourceGroupName $RrgName -VMName $rvmName -DiskEncryptionKeyVaultUrl $getVault.VaultUri -DiskEncryptionKeyVaultId $getvault.ResourceId -VolumeType All -Force
$elapsedTime = $(get-date) - $StartTime
$total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
Write-Host "$total Disk Unlocked & restarted, Please wait till the VM is back online" -ForegroundColor Green
Start-Sleep -Seconds 20
$elapsedTime = $(get-date) - $StartTime
$total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
Write-Host "$total Repair VM $rvmName is ready now" -ForegroundColor Green
}else{
Start-Sleep -Seconds 20
$elapsedTime = $(get-date) - $StartTime
$total = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
Write-Host "$total Repair VM $rvmName is ready now" -ForegroundColor Yellow}

}
        catch
    {
        throw
    }
    finally
    {

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