Update

I don’t know since what version but somewhere this script stopped working because VMware change some things. In 7.8 there was a change about the thumbprint algorithm to DER_BASE64_PEM so it might have started there. Another change is that in the sslcertthumbprint field they stopped using the thumbprint but actually add the entire certificate.

What is needed to fix this?

Replace:

$spec.CertificateOverride=($services.Certificate.Certificate_Validate($spec.serverspec)).thumbprint

with

$spec.CertificateOverride.SslCertThumbprint=($services.Certificate.Certificate_Validate($spec.serverspec)).certificate $spec.CertificateOverride.sslCertThumbprintAlgorithm = "DER_BASE64_PEM"

and you should be good. I have already updated the version of the script below.

A big thank you to Mark Brookfield for asking me about this

/update

Yesterday Sean Massey (https://thevirtualhorizon.com/) asked me if it was possible to add a vCenter server + some other things to Horizon View using the api’s. With a quick look at the api explorer I confirmed this should be possible. The other things he asked I will put in a separate blogpost.

It looks like a simple matter of building the spec and I should be good. In the end it turned out to be a bit more work then expected. Some items are not required according to the api explorer but should at least be called in the spec (set them to something empty) while others can safely be left away. The automatic generated ssl certs in my lab also turned out to be a pita. First I copied them from a current spec and later I downloaded the certificate on the Connection server itself and read that cert. Andrew Morgan (http://andrewmorgan.ie/)from VMware helped me out with this by showing their internal script that they use. It turned out that except for the SSL certs I was on the right path. As usual I will add this functionality to the vmware.hv.helper but since that might take a while I decided to create a useful script

$hvServer = $global:DefaultHVServers[0] $services= $hvServer.ExtensionData # Create required objects $spec=new-object VMware.Hv.VirtualCenterSpec $spec.serverspec=new-object vmware.hv.serverspec $spec.viewComposerData=new-object VMware.Hv.virtualcenterViewComposerData $spec.Certificateoverride=new-object vmware.hv.CertificateThumbprint $spec.limits=new-object VMware.Hv.VirtualCenterConcurrentOperationLimits $spec.storageAcceleratorData=new-object VMware.Hv.virtualcenterStorageAcceleratorData # vCenter Server specs $spec.ServerSpec.servername="pod2vcr1.loft.lab" # Required, fqdn for the vCenter server $spec.ServerSpec.port=443 # Required $spec.ServerSpec.usessl=$true # Required $spec.ServerSpec.username="[email protected]" # Required [email protected] $vcpassword=read-host "vCenter User password?" -assecurestring $temppw = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($vcPassword) $PlainvcPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($temppw) $vcencPassword = New-Object VMware.Hv.SecureString $enc = [system.Text.Encoding]::UTF8 $vcencPassword.Utf8String = $enc.GetBytes($PlainvcPassword) $spec.ServerSpec.password=$vcencPassword $spec.ServerSpec.servertype="VIRTUAL_CENTER" # Description & Displayname, neither is required to be set #$spec.description="description" # Not Required #$spec.displayname="virtualcenterdisplayname" # Not Required $spec.CertificateOverride=($services.Certificate.Certificate_Validate($spec.serverspec)).thumbprint $spec.CertificateOverride.SslCertThumbprint=($services.Certificate.Certificate_Validate($spec.serverspec)).certificate $spec.CertificateOverride.sslCertThumbprintAlgorithm = "DER_BASE64_PEM" # Limits # Only change when you want to change the default values. It is required to set these in the spec $spec.limits.vcProvisioningLimit=20 $spec.Limits.VcPowerOperationsLimit=50 $spec.limits.ViewComposerProvisioningLimit=12 $spec.Limits.ViewComposerMaintenanceLimit=20 $spec.Limits.InstantCloneEngineProvisioningLimit=20 # Storage Accelerator data $spec.StorageAcceleratorData.enabled=$false #$spec.StorageAcceleratorData.DefaultCacheSizeMB=1024 # Not Required # Cmposer # most can be left empty but they need to be set otherwise you'll get a xml error $spec.ViewComposerData.viewcomposertype="STANDALONE" # DISABLED for none, LOCAL_TO_VC for installed with the vcenter and STANDALONE for s standalone composer if ($spec.ViewComposerData.viewcomposertype -ne "DISABLED"){ $spec.ViewComposerData.ServerSpec=new-object vmware.hv.serverspec $spec.ViewComposerData.CertificateOverride=new-object VMware.Hv.CertificateThumbprint $cmppassword=read-host "Composer user password?" -assecurestring $temppw = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($cmpPassword) $PlaincmpPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($temppw) $cmpencPassword = New-Object VMware.Hv.SecureString $enc = [system.Text.Encoding]::UTF8 $cmpencPassword.Utf8String = $enc.GetBytes($PlaincmpPassword) $spec.ViewComposerData.ServerSpec.password=$cmpencPassword $spec.ViewComposerData.ServerSpec.servername="pod2cmp1.loft.lab" $spec.ViewComposerData.ServerSpec.port=18443 $spec.ViewComposerData.ServerSpec.usessl=$true $spec.ViewComposerData.ServerSpec.username="[email protected]" $spec.ViewComposerData.ServerSpec.servertype="VIEW_COMPOSER" $spec.ViewComposerData.CertificateOverride=($services.Certificate.Certificate_Validate($spec.ViewComposerData.ServerSpec)).thumbprint $spec.ViewComposerData.CertificateOverride.sslCertThumbprint = ($services.Certificate.Certificate_Validate($spec.ViewComposerData.ServerSpec)).certificate $spec.ViewComposerData.CertificateOverride.sslCertThumbprintAlgorithm = "DER_BASE64_PEM" } # Disk reclamation, this is required to be set to either $false or $true $spec.SeSparseReclamationEnabled=$false # This will create the connection $services.VirtualCenter.VirtualCenter_Create($spec)

Looking at the output it will only ask for the vCenter user’s password and if a Composer server is set for that user’s password.