# Script to add add ESX servers to vCenter and do initial configuration
#
#
# Version 0.9
#
#
if (Test-Path C:\PSFunctions.ps1) {
	. "C:\PSFunctions.ps1"
} else {
	Write-BuildLog "PSFunctions.ps1 not found. Please copy all PowerShell files from B:\Automate to C:\ and rerun AddHosts.ps1"
	Read-Host "Press <Enter> to exit"	
	exit
}
#if ((Test-Administrator) -and (Test-Path "C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe")) {
#    Write-BuildLog " "
#    Write-BuildLog "This script should not be 'Run As Administrator'" 
#    Write-BuildLog " "
#    Write-BuildLog "Just double click the shortcut" 
#    Write-BuildLog " "
#	Read-Host "Press <Enter> to exit"	
#	exit
#}
$a = (Get-Host).UI.RawUI
$b = $a.WindowSize
$b.Height = $a.MaxWindowSize.Height -1 
$a.WindowSize = $b
# WASP is a 64bit plugin, the Guest Cust. PowerCLI commands are only 32bit
#import-module C:\windows\system32\WASP.dll
#select-window -Title "Administrator: C:\*" | set-windowposition -left 3 -top 3

$Subnet = ((Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .).IPAddress[0]).split(".")[2]
If ($Subnet -eq "199") {
	Write-BuildLog "Building Primary Site"
	$HostPrefix = "host"
	$DCName = "Lab"
	$ClusterName = "Local"
	$SRM = $False
}
If ($Subnet -eq "201") {
	Write-BuildLog "Building SRM Site"
	$HostPrefix = "host1"
	$DCName = "SRM"
	$ClusterName = "DR"
	$SRM = $True
}

if ((Get-Service vpxd).Status -eq "Starting") {
	Write-BuildLog "The vCenter service is still starting; script will pause until service has started."
	do {
		Start-Sleep -Seconds 30
	} until ((Get-Service vpxd).Status -eq "Running")
} elseif ((Get-Service vpxd).Status -eq "Stopped") {
	Write-BuildLog "The vCenter service is stopped. Please verify the DC VM is powered on and databases have started."
	Read-Host "Press <Enter> to exit"
	exit
}

if ((Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null) {
	try {
		Write-BuildLog "Loading PowerCLI plugin, this may take a little while." 
		Add-PSSnapin VMware.VimAutomation.Core
	}
	catch {
		Write-BuildLog "Unable to load the PowerCLI plugin. Please verify installation or install VMware PowerCLI and run this script again."
		Read-Host "Press <Enter> to exit"
		exit
	}
}
for ($i=1;$i -le 4; $i++) {
    $vmhost = "$HostPrefix$i.lab.local"
    $ping = new-object System.Net.NetworkInformation.Ping
    $Reply = $ping.send($vmhost)
    if ($Reply.status –eq "Success") {
		$MaxHosts = $i
    } else {
		$i =4
	}
}
If (!($MaxHosts -ge 2)){
	Write-Host "Couldn't find first two hosts to build, need host1 & host2 built before running this script"
	Read-Host "Build the hosts & rerun this script"
	Exit
}
Write-BuildLog " "
If (!(Test-Path "B:\*")) { Net use B: \\nas\Build}
if (Test-Path "B:\Automate\automate.ini") {
	Write-BuildLog "Determining automate.ini settings."  
	$AdminPWD = ((Select-String -SimpleMatch "Adminpwd=" -Path "B:\Automate\automate.ini").line).substring(9)
	$createds = ((Select-String -SimpleMatch "BuildDatastores=" -Path "B:\Automate\automate.ini").line).substring(16).Trim()
	$createvm = ((Select-String -SimpleMatch "BuildVM=" -Path "B:\Automate\automate.ini").line).substring(8).Trim()
	$createxp = ((Select-String -SimpleMatch "BuildViewVM=" -Path "B:\Automate\automate.ini").line).substring(12).Trim()
	if ($createds -like "true") {
		$createds = $true
		Write-BuildLog " Datastores will be built and added to vCenter." 
	} else {
		$createds = $false
	}
	if ($createvm -like "true") {
		$createvm = $true
		$ProdKey = ((Select-String -SimpleMatch "ProductKey=" -Path "B:\Automate\automate.ini" -List).line).substring(11).Trim()
		Write-BuildLog "  Windows 2003 VM for Lab will be created." 
	} else {
		$createvm = $false
	}
	if ($createxp -like "true") {
		$createxp = $true
		$XPKey = ((Select-String -SimpleMatch "ViewVMProductKey=" -Path "B:\Automate\automate.ini").line).substring(17)
		Write-BuildLog " Windows XP VM for VMware View Lab to be built." 
	} else {
		$createxp = $false
	}
} else {
	Write-BuildLog "Unable to find B:\Automate\automate.ini. Where did it go?" 
}

Write-BuildLog "Connect to vCenter; this takes a while and may show a warning in yellow"  

try {
	If ($SRM -eq $True) {$Connect = "vc2.lab.local"}
	Else {$VCServer = "vc.lab.local"}
	$Connect = Connect-VIServer $VCServer 
}
catch {
	Write-BuildLog "Unable to connect to vCenter. Exiting."  
	Read-Host "Press <Enter> to exit" 
	exit
}
Write-BuildLog "Create datacenter and cluster" 
if ((Get-DataCenter | where {$_.Name -eq $DCName}) -eq $null) {
    $newDC = New-DataCenter -Location (Get-Folder -NoRecursion) -Name $DCName
	$dc = $newDC.ExtensionData.MoRef  
	$pool = New-Object VMware.Vim.IpPool  
	$pool.name = "MyIPPool"  
	$pool.ipv4Config = New-Object VMware.Vim.IpPoolIpPoolConfigInfo  
	$pool.ipv4Config.subnetAddress = "192.168.$Subnet.0"  
	$pool.ipv4Config.netmask = "255.255.255.0"  
	$pool.ipv4Config.gateway = "192.168.$Subnet.2"  
	$pool.ipv4Config.range = "192.168.$Subnet.200#16"  
	$pool.ipv4Config.dns = New-Object System.String[] (1)  
	$pool.ipv4Config.dns[0] = "192.168.$Subnet.4"  
	$pool.ipv4Config.dhcpServerAvailable = $false  
	$pool.ipv4Config.ipPoolEnabled = $true  
	$pool.ipv6Config = New-Object VMware.Vim.IpPoolIpPoolConfigInfo  
	$pool.ipv6Config.subnetAddress = ""  
	$pool.ipv6Config.netmask = "ffff:ffff:ffff:ffff:ffff:ffff::"  
	$pool.ipv6Config.gateway = ""  
	$pool.ipv6Config.dns = New-Object System.String[] (1)  
	$pool.ipv6Config.dns[0] = ""  
	$pool.ipv6Config.dhcpServerAvailable = $false  
	$pool.ipv6Config.ipPoolEnabled = $false  
	$pool.dnsDomain = ""  
	$pool.dnsSearchPath = ""  
	$pool.hostPrefix = ""  
	$pool.httpProxy = ""  
	$pool.networkAssociation = New-Object VMware.Vim.IpPoolAssociation[] (1)  
	$pool.networkAssociation[0] = New-Object VMware.Vim.IpPoolAssociation  
	$pool.networkAssociation[0].network = New-Object VMware.Vim.ManagedObjectReference  
	$pool.networkAssociation[0].network.type = "DistributedVirtualPortgroup"  
	$pool.networkAssociation[0].network.Value = "dvportgroup-178"  
	$pool.networkAssociation[0].networkName = ""  
	$PoolManager = Get-View -Id 'IpPoolManager-IpPoolManager'  
	$Nul = $PoolManager.CreateIpPool($dc, $pool)  
}
if ((Get-Cluster | where {$_.Name -eq $ClusterName}) -eq $null) {
    $Cluster = New-Cluster $ClusterName -DRSEnabled -Location $DCName -DRSAutomationLevel FullyAutomated
}

for ($i=1;$i -le $MaxHosts; $i++) {
    $Num = $i +10
    $VMHost = $HostPrefix
    $VMHost += $i
    $VMHost += ".lab.local"
    $VMotionIP = "172.16.$SubNet."
    $VMotionIP += $Num
    $IPStoreIP1 = "172.17.$SubNet."
    $IPStoreIP1 += $Num
    $IPStoreIP2 = "172.17.$SubNet."
    $Num = $i +20
    $IPStoreIP2 += $Num
    $FTIP = "172.16.$SubNet."
    $FTIP += $Num
    $Num = $i +40
    $vHeartBeatIP = "172.16.$SubNet."
    $vHeartBeatIP += $Num
    Write-BuildLog $VMHost 
    if ((Get-VMHost | where {$_.Name -eq $VMHost}) -eq $null) {
        $Null = Add-VMHost $VMhost -user root -password $AdminPWD -Location $ClusterName -force:$true
		Start-Sleep -Seconds 30
		try {
			$null = Get-VMHost $VMHost
		}
		catch {
			Write-BuildLog "Unable to find " $VMHost "; please verify the host is built and rerun the AddHosts script."
			Read-Host "Press <Enter> to exit"
			exit
		}			
        Start-Sleep 5
		While ((Get-VMHost $VMHost).ConnectionState -ne "Connected"){
            Write-BuildLog " "
            Write-BuildLog $VMHost " is not yet connected. Pausing for 5 seconds."
            Write-BuildLog " "
			Start-Sleep 5
			}
		$VMHostObj = Get-VMHost $VMHost
        if (($vmhostObj.ExtensionData.Config.Product.FullName.Contains("ESXi")) -and ((get-VmHostNtpServer $VMhostobj) -ne "192.168.199.4")) {
            # These services aren't relevant on ESX Classic, only ESXi
            $null = Add-VMHostNtpServer -NtpServer "192.168.199.4" -VMHost $VMhost
            $ntp = Get-VMHostService -VMHost $VMhost | Where {$_.Key -eq "ntpd"}
            $null = Set-VMHostService $ntp -Policy "On"
            $SSH = Get-VMHostService -VMHost $VMhost | Where {$_.Key -eq "TSM-SSH"}
            $null = Set-VMHostService $SSH -Policy "On"
            $TSM = Get-VMHostService -VMHost $VMhost | Where {$_.Key -eq "TSM"}
            $null = Set-VMHostService $TSM -Policy "On"
            if ($vmhostObj.version.split(".")[0] -ne "4") {
                if ($PCLIVerNum -ge 51) {
					$null = Get-AdvancedSetting -Entity $VMHostObj -Name "UserVars.SuppressShellWarning" | Set-AdvancedSetting -Value "1" -confirm:$false
				} else {
					$null = Set-VMHostAdvancedConfiguration -vmhost $VMhost -Name "UserVars.SuppressShellWarning" -Value 1
				}
            }
        }
        $DSName = $VMHost.split('.')[0]
        $DSName += "_Local"
        $sharableIds = Get-ShareableDatastore | Foreach {$_.ID } 
        $null = Get-Datastore -vmhost $vmhost | Where {$sharableIds -notcontains $_.ID } | Set-DataStore -Name $DSName
        $switch = Get-VirtualSwitch -vmHost $vmHostobj 
		if($switch -isnot [system.array]) {
			Write-BuildLog " Configuring network." 
			$null = set-VirtualSwitch $switch -Nic vmnic0,vmnic1 -confirm:$false
			$pg = New-VirtualPortGroup -Name vMotion -VirtualSwitch $switch 
			if ($vmhostObj.ExtensionData.Config.Product.FullName.Contains("ESXi")) {
				$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $VMotionIP -SubnetMask "255.255.255.0" -vMotionEnabled:$true -ManagementTrafficEnabled:$True
			} else {
				$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $VMotionIP -SubnetMask "255.255.255.0" -vMotionEnabled:$true 
				$pg = New-VirtualPortGroup -Name vHeartBeat -VirtualSwitch $switch 
				$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $vHeartBeatIP -SubnetMask "255.255.255.0" -ConsoleNIC 
			}
			$pg = New-VirtualPortGroup -Name FT -VirtualSwitch $switch 
			$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $FTIP -SubnetMask "255.255.255.0" -FaultToleranceLoggingEnabled:$true
			$pg = New-VirtualPortGroup -Name IPStore1 -VirtualSwitch $switch 
			$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $IPStoreIP1 -SubnetMask "255.255.255.0" 
			$pg = New-VirtualPortGroup -Name IPStore2 -VirtualSwitch $switch 
			$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $IPStoreIP2 -SubnetMask "255.255.255.0" 
			$null = Get-VMHostStorage $VMHost | Set-VMHostStorage -SoftwareIScsiEnabled $true
			$null = get-virtualportgroup -name vMotion | Get-NicTeamingPolicy | Set-NicTeamingPolicy -MakeNicActive vmnic1
			$null = get-virtualportgroup -name vMotion | Get-NicTeamingPolicy | Set-NicTeamingPolicy -MakeNicStandby vmnic0
			$pnic = (Get-VMhostNetworkAdapter -VMHost $VMHost -Physical)[2]
			$switch = New-VirtualSwitch -VMhost $vmHost -Nic $pnic.DeviceName -NumPorts 128 -Name vSwitch1
			$null = New-VirtualPortGroup -Name Servers -VirtualSwitch $switch
			$null = New-VirtualPortGroup -Name Workstations -VirtualSwitch $switch
			$null = set-VirtualSwitch $switch -Nic vmnic2,vmnic3 -confirm:$false
			Start-Sleep -Seconds 30
			If ($SRM -ne $True) {
				Write-BuildLog " Add NFS datastores" 
				# Build datastore now added in unattend script
				#$null = New-Datastore -nfs -VMhost $vmhost -Name Build -NFSHost "172.17.199.7" -Path "/mnt/LABVOL/Build" -readonly
				$null = New-Datastore -nfs -VMhost $vmhost -Name NFS01 -NFSHost "172.17.199.7" -Path "/mnt/LABVOL/NFS01"
				$null = New-Datastore -nfs -VMhost $vmhost -Name NFS02 -NFSHost "172.17.199.7" -Path "/mnt/LABVOL/NFS02"
			}
			if ($vmhostObj.version.split(".")[0] -ne "4") {
				$null = remove-datastore -VMhost $vmhost -datastore remote-install-location -confirm:$false
			}
			Write-BuildLog " Configuring iSCSI" 
			$MyIQN = "iqn.1998-01.com.vmware:" + $VMHost.split('.')[0]
			$null = Get-VMHostHba -VMhost $vmhost -Type iScsi | Set-VMHostHBA -IScsiName $MyIQN 
			If ($SRM -ne $True) {
				$null = Get-VMHostHba -VMhost $vmhost -Type iScsi | New-IScsiHbaTarget -Address 172.17.199.7 -Type Send
				$null = Get-VMHostStorage $VMHost -RescanAllHba
			}
		}
		$null = Move-VMhost $VMHost -Destination $ClusterName
		}
}

Write-BuildLog "Restarting all hosts for consistency. This will take a few minutes."  
$null = Get-VMHost -location $ClusterName | Restart-VMHost -confirm:$false -Force
Write-Host "Wait until all hosts have stopped pinging"
$PingStatus = @()
for ($i=1;$i -le $MaxHosts; $i++) {$PingStatus +=$True}
do {
	Start-Sleep -Seconds 1
	$ping = new-object System.Net.NetworkInformation.Ping
	for ($i=1;$i -le $MaxHosts; $i++) {
		$VMHost = $HostPrefix
		$VMHost += $i
		$VMHost += ".lab.local"
		If ((!(($ping.send($vmhost)).status –eq "Success")) -and ($PingStatus[$I-1] -eq $True)) {$PingStatus[$I-1] = $False}
	}
	$StayHere = $False
	for ($i=1;$i -le $MaxHosts; $i++) {
		If ($PingStatus[$I-1] -eq $True) {$StayHere = $True}
	}
} while ($StayHere)
Write-Host "Wait until all hosts are pinging"
do {
	Start-Sleep -Seconds 1
	$ping = new-object System.Net.NetworkInformation.Ping
	for ($i=1;$i -le $MaxHosts; $i++) {
		$VMHost = $HostPrefix
		$VMHost += $i
		$VMHost += ".lab.local"
		If (($ping.send($vmhost)).status –eq "Success")  {$PingStatus[$I-1] = $True}
	}
	$StayHere = $False
	for ($i=1;$i -le $MaxHosts; $i++) {
		If ($PingStatus[$I-1] -eq $False) {$StayHere = $True}
	}
} while ($StayHere)
Write-Host "Wait until all hosts are Connected"
for ($i=1;$i -le $MaxHosts; $i++) {$PingStatus +=$False}
do {
	Start-Sleep -Seconds 1
	for ($i=1;$i -le $MaxHosts; $i++) {
		$VMHost = $HostPrefix
		$VMHost += $i
		$VMHost += ".lab.local"
		If ((get-vmhost -name $VMHost).ConnectionState -eq "Connected" ) {$PingStatus[$I-1] = $True}
	}
	$StayHere = $False
	for ($i=1;$i -le $MaxHosts; $i++) {
		If ($PingStatus[$I-1] -eq $False) {$StayHere = $True}
	}
} while ($StayHere)
Write-Host "Wait 2 minutes so last host is properly up"
start-sleep 120
If ($SRM -ne $True){
	if (((Get-OSCustomizationSpec | where {$_.Name -eq "Windows"}) -eq $null) -and ($ProdKey -ne $null) ){
		$null = New-OsCustomizationSpec -Name Windows -OSType Windows -FullName Lab -OrgName Lab.local -NamingScheme VM -ProductKey $ProdKey -LicenseMode PerSeat -AdminPass VMware1! -Workgroup Workgroup -ChangeSid -AutoLogonCount 999
	}
	if (((Get-OSCustomizationSpec | where {$_.Name -eq "WinXP"}) -eq $null) -and ($ProdKey -ne $null)) {
		$null = New-OsCustomizationSpec -Name WinXP -OSType Windows -FullName Lab -OrgName Lab.local -NamingScheme VM -ProductKey $XPKey -LicenseMode PerSeat -AdminPass VMware1! -Workgroup Workgroup -ChangeSid -AutoLogonCount 999
	}
	$VMHostObj = Get-VMHost $VMHost
	If (($VMHostObj.Version.Split("."))[0] -eq "6") {
		$MinVMFSVer = 5
	} Else {
		$MinVMFSVer = 3
	}
	if ($CreateDS) {
		Write-BuildLog "Creating iSCSI datastores."  
		$iSCSILUNs = get-scsilun -vmhost $VMHost -CanonicalName "t10.*"
		if ($iSCSILUNs -eq $Null) {$iSCSILUNs = get-scsilun -vmhost $VMHost -CanonicalName "naa.*"}
		if ($vmhostobj.version.split(".")[0] -ne "4") {
			if (((Get-Datastore | where {$_.Name -eq "iSCSI1"}) -eq $null) ) {
				$null = New-Datastore -VMHost $VMHost -Name iSCSI1 -Path $iSCSILUNs[0].CanonicalName -Vmfs -FileSystemVersion 5
				Write-BuildLog "Created iSCSi1 Datstore"  
			} else {
				Write-BuildLog "Registering all VMs found on existing datastore iSCSI1."  
				Register-VMs ("iSCSI1")
			}
		}
		if ((Get-Datastore | where {$_.Name -eq "iSCSI2"}) -eq $null) {
			$null = New-Datastore -VMHost $VMHost -Name iSCSI2 -Path $iSCSILUNs[1].CanonicalName -Vmfs -FileSystemVersion $MinVMFSVer
			Write-BuildLog "Created iSCSi2 Datastore"  
		}  else {
			Write-BuildLog "Registering all VMs found on existing datastore iSCSI2."  
			Register-VMs ("iSCSI2")
		}
		if ((Get-Datastore | where {$_.Name -eq "iSCSI3"}) -eq $null) {
			$null = New-Datastore -VMHost $VMHost -Name iSCSI3 -Path $iSCSILUNs[2].CanonicalName -Vmfs -FileSystemVersion $MinVMFSVer
			Write-BuildLog "Created iSCSi3 datstore"  
		} else {
			Write-BuildLog "Registering all VMs found on existing datastore iSCSI3"  
			Register-VMs ("iSCSI3")
		}
	}
	Write-BuildLog "Setting up HA on cluster since shared storage is configured." 
	$Cluster = Get-Cluster -Name $ClusterName
	$null = set-cluster -cluster $Cluster -HAEnabled:$True -HAAdmissionControlEnabled:$True -confirm:$false
	$null = New-AdvancedSetting -Entity $cluster -Type ClusterHA -Name 'das.isolationaddress1' -Value "192.168.$SubNet.4" -confirm:$false -force
	$null = New-AdvancedSetting -Entity $cluster -Type ClusterHA -Name 'das.isolationaddress2' -Value "172.17.$SubNet.7" -confirm:$false -force
	$null = New-AdvancedSetting -Entity $cluster -Type ClusterHA -Name 'das.usedefaultisolationaddress' -Value false -confirm:$false -force
	$spec = New-Object VMware.Vim.ClusterConfigSpecEx
	$null = $spec.dasConfig = New-Object VMware.Vim.ClusterDasConfigInfo
	$null = $spec.dasConfig.admissionControlPolicy = New-Object VMware.Vim.ClusterFailoverResourcesAdmissionControlPolicy
	$null = $spec.dasConfig.admissionControlPolicy.cpuFailoverResourcesPercent = 50
	$null = $spec.dasConfig.admissionControlPolicy.memoryFailoverResourcesPercent = 50
	$Cluster = Get-View $Cluster
	$null = $Cluster.ReconfigureComputeResource_Task($spec, $true)
	Write-BuildLog "Waiting two minutes for HA to complete configuration." 
	Start-Sleep -Seconds 120
	
	$VMHostObj = Get-VMHost $VMHost
	$VMName="Template2012"
	if (($CreateVM) -and ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) -and (test-path "\\192.168.199.7\build\Win2012.ISO")) {
		$Datastore = Get-Datastore -VMhost $vmHost -name "NFS01"	
		Start-Sleep -Seconds 2
		if (!(Get-PSDrive -Name NFS01 -ErrorAction "SilentlyContinue")) {
			$null = New-PSDrive -Name NFS01 -PSProvider ViMdatastore -Root '\' -Location $Datastore
		}
		#Create new VM if existing VM or template doesn't exist
		if (!(Test-Path NFS01:\$VMName\$VMName.vmdk)) {
			Write-BuildLog "Creating Template2012 VM as Windows Server 2012"  
			If ((Get-vmhost)[0].version -lt "5.5.0"){
				$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 768 -DiskMB 16384 -DiskStorageFormat Thin -GuestID windows8Server64Guest 
				get-networkadapter $MyVM |set-networkadapter -type e1000 -confirm:$false 
			} Else {
				$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 768 -DiskMB 16384 -DiskStorageFormat Thin -GuestID windows8Server64Guest -Version "v8"
			}
			$null = New-CDDrive -VM $MyVM -ISOPath "[Build] /Win2012.ISO" -StartConnected
			$null = New-FloppyDrive -VM $MyVM -FloppyImagePath "[Build] Automate/BootFloppies/Nested2012.flp" -StartConnected
			$strBootHDiskDeviceName = "Hard disk 1"
			$viewVM = Get-View -ViewType VirtualMachine -Property Name, Config.Hardware.Device -Filter @{"Name" = "^$VMName$"}
			## get the VirtualDisk device, then grab its Key (DeviceKey, used later)
			$intHDiskDeviceKey = ($viewVM.Config.Hardware.Device | ?{$_.DeviceInfo.Label -eq $strBootHDiskDeviceName}).Key
			## bootable Disk BootOption device, for use in setting BootOrder (the corresponding VirtualDisk device is bootable, assumed)
			$oBootableHDisk = New-Object -TypeName VMware.Vim.VirtualMachineBootOptionsBootableDiskDevice -Property @{"DeviceKey" = $intHDiskDeviceKey}
			## bootable CDROM device (per the docs, the first CDROM with bootable media found is used)
			$oBootableCDRom = New-Object -Type VMware.Vim.VirtualMachineBootOptionsBootableCdromDevice
			## create the VirtualMachineConfigSpec with which to change the VM's boot order
			$spec = New-Object VMware.Vim.VirtualMachineConfigSpec -Property @{"BootOptions" = New-Object VMware.Vim.VirtualMachineBootOptions -Property @{BootOrder = $oBootableCDRom, $oBootableHDisk}}
			$null = $viewVM.ReconfigVM_Task($spec)
			Write-BuildLog "Powering on VM and installing Windows."  
			$null = Start-VM $MyVM
		} else {
			Write-BuildLog "Found existing WinTemplate."  
			if (Test-Path NFS01:\$VMName\$VMName.vmtx) {
				Write-BuildLog "Registering existing Template2012 template."  
				$vmxFile = Get-Item NFS01:\$VMName\$VMName.vmtx
				$null = New-Template -VMHost $VMHost -TemplateFilePath $vmxFile.DatastoreFullPath
				Write-BuildLog "Existing WinTemplate Template added to inventory."  
			}
		}
		Start-Sleep -Seconds 2
		$null = Remove-PSDrive NFS01
	}
	
	
	if ($vmhostObj.version.split(".")[0] -eq "4") {
		$Datastore = Get-Datastore -VMhost $vmHost -name "iSCSI2"
		$VMName="WinTemplate4"
	} else {
		$Datastore = Get-Datastore -VMhost $vmHost -name "iSCSI1"
		$VMName="WinTemplate"
	}
	
	if (($CreateVM) -and ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) -and (test-path "\\192.168.199.7\build\Auto2K3.ISO")) {
		if (!(Get-PSDrive -Name iSCSI1 -ErrorAction "SilentlyContinue")) {
			$null = New-PSDrive -Name iSCSI1 -PSProvider ViMdatastore -Root '\' -Location $Datastore
		}
		Start-Sleep -Seconds 2
		#Create new VM if existing VM or template doesn't exist
		if (!(Test-Path iSCSI1:\$VMName\$VMName.vmdk)) {
			Write-BuildLog "Creating WinTemplate VM Windows Server 2003."  
			If ((Get-vmhost)[0].version -lt "5.5.0"){
				$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -DiskMB 3072 -DiskStorageFormat Thin -GuestID winNetEnterpriseGuest
			} Else {
				$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -DiskMB 3072 -DiskStorageFormat Thin -GuestID winNetEnterpriseGuest -Version "v8"
			}
			$null = New-CDDrive -VM $MyVM -ISOPath "[Build] /Auto2K3.iso" -StartConnected
			Write-BuildLog "Powering on VM and installing Windows."  
			$null = Start-VM $MyVM
		} else {
			Write-BuildLog "Found existing WinTemplate."  
			if (Test-Path iSCSI1:\$VMName\$VMName.vmtx) {
				Write-BuildLog "Registering existing WinTemplate template."  
				$vmxFile = Get-Item iSCSI1:\$VMName\$VMName.vmtx
				$null = New-Template -VMHost $VMHost -TemplateFilePath $vmxFile.DatastoreFullPath
				Write-BuildLog "Existing WinTemplate Template added to inventory."  
			}
		}
		Start-Sleep -Seconds 2
		$null = Remove-PSDrive iSCSI1
	}
	$VMName = "WinXP"
	$Datastore = Get-Datastore "iSCSI2"
	if (($CreateXP) -and ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) -and (test-path "\\192.168.199.7\build\AutoXP.iso")) {
		if (!(Get-PSDrive -Name iSCSI2 -ErrorAction "SilentlyContinue")) {
			$null = New-PSDrive -Name iSCSI2 -PSProvider ViMdatastore -Root '\' -Location $Datastore
		}
		Start-Sleep -Seconds 2
		#Create new VM if existing VM or template doesn't exist
		if (!(Test-Path iSCSI2:\$VMName\$VMName.vmdk)) {
			Write-BuildLog "Creating Windows XP VM for View."  
			If ((Get-vmhost)[0].version -lt "5.5.0"){
				$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -GuestID winXPProGuest
			} Else {
				$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -GuestID winXPProGuest -Version "v8"
			}
			$null = New-CDDrive -VM $MyVM -ISOPath "[Build] /AutoXP.iso" -StartConnected
			$null = New-FloppyDrive -VM $MyVM -FloppyImagePath "[Build] Automate/BootFloppies/vmscsi-1.2.0.4.flp" -StartConnected
			$strBootHDiskDeviceName = "Hard disk 1"
			$viewVM = Get-View -ViewType VirtualMachine -Property Name, Config.Hardware.Device -Filter @{"Name" = "^$VMName$"}
			## get the VirtualDisk device, then grab its Key (DeviceKey, used later)
			$intHDiskDeviceKey = ($viewVM.Config.Hardware.Device | ?{$_.DeviceInfo.Label -eq $strBootHDiskDeviceName}).Key
			## bootable Disk BootOption device, for use in setting BootOrder (the corresponding VirtualDisk device is bootable, assumed)
			$oBootableHDisk = New-Object -TypeName VMware.Vim.VirtualMachineBootOptionsBootableDiskDevice -Property @{"DeviceKey" = $intHDiskDeviceKey}
			## bootable CDROM device (per the docs, the first CDROM with bootable media found is used)
			$oBootableCDRom = New-Object -Type VMware.Vim.VirtualMachineBootOptionsBootableCdromDevice
			## create the VirtualMachineConfigSpec with which to change the VM's boot order
			$spec = New-Object VMware.Vim.VirtualMachineConfigSpec -Property @{"BootOptions" = New-Object VMware.Vim.VirtualMachineBootOptions -Property @{BootOrder = $oBootableCDRom, $oBootableHDisk}}
			$null = $viewVM.ReconfigVM_Task($spec)
			$Null = Start-VM $MyVM
		} else {
			Write-BuildLog "Found existing WinXP."  
			if (Test-Path iSCSI1:\$VMName\$VMName.vmtx) {
				Write-BuildLog "Registering existing WinTemplate template."  
				$vmxFile = Get-Item iSCSI2:\$VMName\$VMName.vmtx
				$null = New-Template -VMHost $VMHost -TemplateFilePath $vmxFile.DatastoreFullPath
				Write-BuildLog "Existing WinTemplate Template added to inventory."  
			}
		}
		Start-Sleep -Seconds 2
		$null = Remove-PSDrive iSCSI2
	}
	$VMName = "TTYLinux"
	if ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) {
		Write-BuildLog "Registering existing tiny TTYLinux VM."  
		$Datastore = Get-Datastore "Build"
		if (!(Get-PSDrive -Name Build -ErrorAction "SilentlyContinue")) {
			$null = New-PSDrive -Name Build -PSProvider ViMdatastore -Root '\' -Location $Datastore
		}
		$Datastore = Get-Datastore "iSCSI3"
		if (!(Get-PSDrive -Name iSCSI3 -ErrorAction "SilentlyContinue")) {
			$null = New-PSDrive -Name iSCSI3 -PSProvider ViMdatastore -Root '\' -Location $Datastore
		}
		if (!(Test-Path iSCSI3:/TTYLinux/TTYLinux.vmx)) {
			Write-BuildLog "Copying TTYLinux VM to iSCSI3 datastore."  
			$Datastore = Get-Datastore "iSCSI3"
			Copy-DatastoreItem Build:/Automate/ShellVMs/TTYLinux  iSCSI3:\ -recurse
		}
		$vmxFile = Get-Item iSCSI3:/TTYLinux/TTYLinux.vmx
		$null= New-VM -VMFilePath $VMXFile.DatastoreFullPath -VMHost $vmhost -Location "vm" -name "TTYLinux"
		Start-Sleep -Seconds 2
		$null = Remove-PSDrive Build
		$null = Remove-PSDrive iSCSI3
	}
}
Write-BuildLog " "

$null = Disconnect-VIServer -Server * -confirm:$false
if (Test-Path "C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe") {
	Read-Host " Configuration complete, press <Enter> to continue."
}
exit
