April 7 2016

VDI Maintenance Mode Switcher Powershell Script

Problem: VDI Maschinen in unserer Farm werden bei Inaktivität heruntergefahren und nur bei Bedarf gestartet. Dadurch kann es vereinzelt Maschinen geben, die nur sehr selten Online sind. Daher fehlen hier aktuelle Polices, Patches und Softwarepakete.

Lösung: Ich habe ein PowerShell Script geschrieben, welches über den Aufgabenplaner am Wochenende ausgeführt werden kann. Das Script aktiviert/deaktiviert den Maintenance Mode und (neu-)stratet die entsprechenden Maschinen.

Mal sehen ob sich das bewährt… :-)
Dies ist so nebenbei auch mein erstes handgeklöppeltes Powershell Script, für Fehler übernehme ich keine Haftung.

 

-> get the script <-

 

VDI_MM_Switcher_v1.4.ps1

<#
.SYNOPSIS
    This script enable or disable Maintenance Mode for Citrix VDI machines.
.DESCRIPTION
    The script read a static text file with hostnames and enable or disable maintance mode for each machine.
    The script will wait 60 seconds after each machine.
    If a target VDI is powered off it will be started automatically, if a target VDI is powered on it will be restarted if not in use.
.PARAMETER MaintenanceMode
    Specifies if the Maintenance Mode should be switched on or off. Options: Enable, Disable.
.PARAMETER HostListFile
    List of target Host names without Domain.
.EXAMPLE
    powershell.exe '.\VDI_MM_Switcher_v1.4.ps1' -MaintenanceMode "Enable" -HostListFile "C:\VDI_MM_Switcher\hosts.txt"
.EXAMPLE
    powershell.exe '.\VDI_MM_Switcher_v1.4.ps1' -MaintenanceMode "Disable" -HostListFile "C:\VDI_MM_Switcher\hosts.txt"
.NOTES
    Change Log
    V1.0 - 05.04.2016 - Manuel Kuss - frist release
    V1.1 - 05.04.2016 - Manuel Kuss - added logging
    V1.3 - 06.04.2016 - Manuel Kuss - added param()
    V1.4 - 07.04.2016 - Manuel Kuss - added SummaryState check
.LINK 
    http://www.nova17.de
#>

param(
    [string]$MaintenanceMode,
    [string]$HostListFile
)

Clear

## Load Addins
Add-PSSnapin Citrix.*

## Syntax Checker
If (($MaintenanceMode -eq "") -or ($HostListFile -eq "")) {
    Write-Host "ERROR MISSING PARAMETER`nSyntax: .\VDI_MM_Switcher_v1.4.ps1 -MaintenanceMode `"Enable/Disable`" -HostListFile `"C:\Path\hosts.txt`"" -ForegroundColor Red
    Exit
} 

## Variables (customize)
$AdminServer = 'hostname.domain.tld'
$ADDomain = 'YOUR-AD-DOMAIN'
## Variables
$HostList = Get-Content $HostListFile
$Logfile = "$HostListFile" + "_$MaintenanceMode" + ".log"

## Output
Write-Host "Executing..." -ForegroundColor Yellow
$starttime = Get-Date -Format G
write "--------------------------------------------------------" | Out-File $Logfile
Write "Script Start Time: $starttime" | Out-File $Logfile -Append
write "--------------------------------------------------------" | Out-File $Logfile -Append

## Enable Maintenance Mode Loop ##
if ($MaintenanceMode -eq 'Enable') 
    {
    foreach ($item in $HostList)
        {
            ## Write DOMAIN\HOSTNAME to $TargetVDI
            $TargetVDI = "$ADDomain" + "\" + "$item"
            
            ## Enable Maintenance Mode
            Write "Enable MaintenanceMode for $TargetVDI" | Out-File $Logfile -Append
            Set-BrokerMachineMaintenanceMode -InputObject $TargetVDI $true -adminaddress $AdminServer

            ## Restart if TargetVDI is not in use
            foreach ($item in Get-BrokerDesktop | Where-Object{($_.MachineName -eq "$TargetVDI") -and ($_.PowerState -eq "On") -and ($_.SummaryState -ne "InUse")} | Select-Object -Property MachineName)
                { New-BrokerHostingPowerAction -MachineName $TargetVDI -Action Restart -adminaddress $AdminServer | Out-File $Logfile -Append }

            ## If TargetVDI is powered off
            foreach ($item in Get-BrokerDesktop | Where-Object{($_.MachineName -eq "$TargetVDI") -and ($_.PowerState -eq "Off")} | Select-Object -Property MachineName)
                { New-BrokerHostingPowerAction -MachineName $TargetVDI -Action TurnOn -adminaddress $AdminServer | Out-File $Logfile -Append }
            
            ## Pause
            Write "--------------------------------------------------------" | Out-File $Logfile -Append
            Start-Sleep 60
        }
    }

## Disable Maintenance Mode Loop ##
if ($MaintenanceMode -eq 'Disable') 
    {
    foreach ($item in $HostList)
        {
            ## Write DOMAIN\HOSTNAME to $TargetVDI
            $TargetVDI = "$ADDomain" + "\" + "$item"
          
            ## Disable MaintenanceMode
            Write "Disable MaintenanceMode for $TargetVDI" | Out-File $Logfile -Append
            Set-BrokerMachineMaintenanceMode -InputObject $TargetVDI $false -adminaddress $AdminServer
            
            ## Restart if TargetVDI is not in use
            foreach ($item in Get-BrokerDesktop | Where-Object{($_.MachineName -eq "$TargetVDI") -and ($_.PowerState -eq "On") -and ($_.SummaryState -ne "InUse")} | Select-Object -Property MachineName)
                { New-BrokerHostingPowerAction -MachineName $TargetVDI -Action Restart -adminaddress $AdminServer | Out-File $Logfile -Append }
                           
            ## Pause
            Write "--------------------------------------------------------" | Out-File $Logfile -Append
            Start-Sleep 60
        }
    }

## Output
$endtime = Get-Date -Format G
Write "Script End Time: $endtime" | Out-File $Logfile -Append
write "--------------------------------------------------------" | Out-File $Logfile -Append
Write-Host "Script Execuded." -ForegroundColor Yellow
Mai 28 2013

Convert VMDK to VHD (VMware Workstation to Hyper-V)

Da Win8pro Hyper-V onboard hat fliegt nun VMware Workstation vom System.

Thema: Konvertieren der existierenden VMware Workstation VM’s.

Lösung: Microsoft Virtual Machine Converter (MVMC) Solution Accelerator
http://www.microsoft.com/en-us/download/details.aspx?id=34591

 

Nach der Installation des MVMC wird eine Eingabeaufforderung mit administrativen Rechten benötigt.

„C:\Program Files (x86)\Microsoft Virtual Machine Converter Solution Accelerator\mvdc.exe“ „D:\VMware\VM01\hd01.vmdk“ „D:\Hyper-V\Virtual Hard Disks\vm01_hd01.vhd“

und dann warten… Kann je nach Größe dauern.

 

Das VHD File kann danach jedem Hyper-V Guest angehängt werden.

 

Wenn möglich dann sollten die VMware Tools noch unter VMware deinstalliert werden. Ansonsten deises folgendes Uninstall Tool von VMware.

Siehe VMware Knowledgebase Article 1001354 + 1308

Juni 1 2012

Boot VHD auf einen physikalischen Datenträger klonen

Szenario:
Windows 7 installiert auf einer virtuellen Festplatte (VHD), diese ist ist als Laufwerk C: eingebunden und das Bootlaufwerk. Der physikalische Datenträger ist Laufwerk D:.

Ziel:
Die VHD Datei soll gelöscht werden, der Rechner soll von einem neuen, zweiten, physikalischen Datenträger starten.

Vorbereitung:
Für die folgenden Schritte benötigen wir das Tool imagex.exe von Microsoft. Dies befindet sich im WAIK (Windows Automated Installation Kit) Ordner unter toolsamd64 (oder x86 je nach Gusto). Das WAIK kann beim Microsoft kostenlos heruntergeladen werden.

Desweiteren benötigen wir einen Windows 7 Datenträger oder ein Systemreparaturdatenträger welchen wir unter Windows 7 auch brennen können. (Systemsteuerung -> System und Sicherheit -> Sichern und Wiederherstellen -> Systemreparaturdatenträger erstellen)

Ablauf:
Da die VHD als Boot Partition läuft können wir folgende Schritte nicht sauber im laufenden Betrieb durchführen, weshalb wir in das WinPE booten (mit dem Reparaturdatenträger oder der Windows DVD). Statt zu installieren oder zu reparieren wählen wir die Eingabeaufforderung aus.

Als erstes schauen wir welche Buchstaben die Laufwerke haben, in meinem Beispiel hat die alte Festplatte den Buchstaben F: und die neue Festplatte den Buchstaben G: erhalten.

Schritt 1 – VHD mounten
diskpart
> select vdisk file F:boot.vhd
> attach vdisk
> exit

Schritt 2 – Image der virtuellen Disk erstellen
imagex /capture I: F:boot.wim „boot drive“
In meinem Beispiel wurde die VHD als Laufwerk I: in das System eingebunden. ImageX erstellt immer WIM Images, in diesem Fall liegt dieses dann auch auf der alten physikalischen Festplatte.

Schritt 4 – VHD auswerfen
diskpart
> select disk 0
> select vdisk file F:boot.vhd
> detach vdisk
> exit
Da die VHD vermutlich noch vom einhängen das aktive Laufwerk ist muss im ersten Schritt eine andere Festplatte ausgewählt werden (select disk).

Schritt 5 – WIM Image auf neue Festplatte klonen
imagex /apply F:boot.wim 1 G:
Die Zahl bezieht sich auf das erste Image in der WIM Datei. Da wir das Image erst erstellt haben befindet sich natürlich nur ein Image in dem Container.

Schritt 6 – VHD umbenennen
Nun benennen wir die boot.vhd in boot.old um und starten den Rechner neu. Wenn alles klappt erkennt der Bootloader die Änderung und Windows startet. Falls nicht hilft hier der Reparaturdatenträger mit der Startoptionen-Reparatur.