VMware Cloud Foundation (VCF) 9.1 introduces a few new updates with the license entitlement workflow between VCF Operations and VCF Business Service Console (BSC) for users operating in an air-gapped or disconnected environment.
Below is a visual that outlines the workflow between VCF BSC (red) and VCF Operations (orange), along with the new changes in 9.1:

Whether your organization will have a single or multiple VCF Fleets, automation is essential for consistency and operating at scale.
Last year, I had created a PowerShell Module called Broadcom.Community.VCFLicensing that can help users fully automate the end-to-end licensing entitlement process and I am please to share that it has now been refreshed to support VCF 9.1!
Step 1 - Install and/or Update the Powershell Module by running the following command:
Install Module
Install-Module Broadcom.Community.VCFLicensing
Update Module
Update-Module Broadcom.Community.VCFLicensing
Step 2 - Login to VCF BSC portal (https://vcf.broadcom.com) to create an OAuth API Client by navigating to Access Management->OAuth Apps and make a note of the Client ID and Client Secret.
You will also need to make a note of your BSC Tenant ID, which can be obtained by hovering over the info icon next to your SiteID on the left hand navigation.

Step 3 - Create your desired VCF license allocation in the VCF BSC portal by navigating to Licenses section on the left hand navigation. In my example, I have created two license allocations with the following:
- wlam-vcf with 256 VCF cores
- wlam-vsan with 256 vSAN TiBs

Make a note of the license allocation labels as they will be referenced in the next step.
Step 4 - Update the following user variables that will be used by the various functions.
$VCF_OPERATIONS_HOSTNAME="vcf01.vcf.lab" $VCF_OPERATIONS_USERNAME="admin" $VCF_OPERATIONS_PASSWORD='VMware1!VMware1!' $VCF_BSC_OAUTH_CLIENT_ID="XXX" $VCF_BSC_OAUTH_CLIENT_SECRET="XXX" $VCF_BSC_TENANT_ID="XXX" $VCENTER_HOSTNAME="vc01.vcf.lab" $VCF_LICENSE_ENTITLEMENT_NAME="wlam-vcf" $VSAN_LICENSE_ENTITLEMENT_NAME="wlam-vsan"
Step 5 - Login to both your VCF Operations instance using the Connect-VcfOperations function and Connect-VcfBsc function.
$CWD = (Get-Location).Path
$VCF_OPERATIONS_REGISTRATION_LABEL=$VCF_OPERATIONS_HOSTNAME
$VCF_LICENSE_FILENAME="${VCF_OPERATIONS_HOSTNAME}.lic"
$VCF_VERIFICATION_FILENAME="${VCF_OPERATIONS_HOSTNAME}.verification"
$VCF_VERIFICATION_FILE="${CWD}/${VCF_VERIFICATION_FILENAME}"
$VCF_LICENSE_FILE="${CWD}/${VCF_LICENSE_FILENAME}"
Connect-VcfOperations -Fqdn $VCF_OPERATIONS_HOSTNAME -User $VCF_OPERATIONS_USERNAME -Password $VCF_OPERATIONS_PASSWORD
Connect-VcfBsc -ClientId $VCF_BSC_OAUTH_CLIENT_ID -SecretId $VCF_BSC_OAUTH_CLIENT_SECRET
![]()
Note: There are few variable declarations above the connect commands, make sure these are defined as-is or you will have issues following the examples.
Step 6 - Run the Download-VcfOperationsRegistrationFile function to download the registration file from your VCF Operations instance to your local system as shown in the screenshot below.
$DEFAULT_REG_FILENAME = Download-VcfOperationsRegistrationFile $REGISTRATION_FILENAME = [System.IO.Path]::ChangeExtension($DEFAULT_REG_FILENAME, ".registration") Rename-Item $DEFAULT_REG_FILENAME $REGISTRATION_FILENAME
![]()
Note: There is a known issue where the registration file from VCF Operations will have a file extension of .data but the VCF BSC portal has been updated to require .registration extension and the commands above will handle the file rename.
Step 7 - Register your VCF Operations instance by using the Register-VcfOperations2 function providing the registration file that was downloaded from Step 6 and friendly name to label your VCF Operations instance in VCF BSC portal.
$VCF_OPERATIONS_REGISTRATION_FILE="${CWD}/${REGISTRATION_FILENAME}"
$VCF_OPERATIONS_BSC_ID=Register-VcfOperations2 -TenantId $VCF_BSC_TENANT_ID -RegistrationFile $VCF_OPERATIONS_REGISTRATION_FILE -Name $VCF_OPERATIONS_REGISTRATION_LABEL
![]()
Upon successful registration, an ID will be returned for the your VCF Operations instance that is required for future operations and it is automatically stored in $VCF_OPERATIONS_BSC_ID variable.
Step 8 - Next, we need to download the verification file from VCF BSC portal by using the Download-VcfBscVerificationFile function providing the registered ID for our VCF Operations instance and the name of the verification file to save.
Download-VcfBscVerificationFile -TenantId $VCF_BSC_TENANT_ID -VcfOperationsId $VCF_OPERATIONS_BSC_ID -VerificationFile $VCF_VERIFICATION_FILE
Step 9 - We now need to upload the verification file to VCF Operation by using the Import-VcfOperationsVerificationFile function and provide the full path to the verification file.
$VCF_OPERATIONS_CONFIRMATION_FILE=Import-VcfOperationsVerificationFile -VerificationFile $VCF_VERIFICATION_FILE
Upon successful import, VCF Operations will return a confirmation file that will be saved locally.
Step 10 - The confirmation file needs to be imported to VCF BSC portal by using the Import-VcfOperationsConfirmationFile function to complete the challenge/response process providing the registered ID for our VCF Operations instance and the full path to the confirmation file.
$VCF_LICENSE_SERVER_BSC_ID=Import-VcfOperationsConfirmationFile -TenantId $VCF_BSC_TENANT_ID -VcfOperationsId $VCF_OPERATIONS_BSC_ID -ConfirmationFile $VCF_OPERATIONS_CONFIRMATION_FILE
Step 11 - Assuming Step 3 was completed earlier, we can now retrieve the license allocations from VCF BSC portal and associate that with our registered VCF Operations instance and its associated VCF License Server ID, which was returned from completing the challenge/response process from previous step.
$BSC_VCF_LICENSE_ID=(Get-VcfBscLicense -TenantId $VCF_BSC_TENANT_ID -Name $VCF_LICENSE_ENTITLEMENT_NAME).id $BSC_VSAN_LICENSE_ID=(Get-VcfBscLicense -TenantId $VCF_BSC_TENANT_ID -Name $VSAN_LICENSE_ENTITLEMENT_NAME).id $VCF_BSC_LICENSE_IDS=@($BSC_VCF_LICENSE_ID,$BSC_VSAN_LICENSE_ID) Set-VcfBscLicense2 -TenantId $VCF_BSC_TENANT_ID -LicenseServerId $VCF_LICENSE_SERVER_BSC_ID -LicenseIds $VCF_BSC_LICENSE_IDS -Operation Associate
![]()
Note: In my example, I am associating both VCF core entitlement and vSAN TiB entitlement. If you only have VCF entitlements or some other combination, the $VCF_BSC_LICENSE_IDS variable simply just needs to contain the IDs of the license allocations that wish to associate with your VCF License Server.
Step 12 - We are now ready to download our VCF license file by using the Download-VcfBscLicense function.
$VCF_LICENSE_FILE=Download-VcfBscLicense -TenantId $VCF_BSC_TENANT_ID -VcfOperationsId $VCF_OPERATIONS_BSC_ID -LicenseFile $VCF_LICENSE_FILE
Step 13 - For VCF Operations to use the VCF license, we need to import it using the Import-VcfOperationsLicenseFile function with the full path to the license file.
Import-VcfOperationsLicenseFile -LicenseFile $VCF_LICENSE_FILE
Step 14 - Finally, we can assign the VCF entitlements within VCF Operations by using a combination of Get-VcfOperationsVcenters2, Get-VcfOperationsEntitlements and Set-VcfOperationsLicenseAssignment2 functions.
$VCENTER_ID=$((Get-VcfOperationsVcenters2 | where {$_.vCenter -eq $VCENTER_HOSTNAME}).Id)
$VCF_LICENSE_ID=$((Get-VcfOperationsEntitlements | where {$_.Name -eq $VCF_LICENSE_ENTITLEMENT_NAME}).Id)
$VSAN_LICENSE_ID=$((Get-VcfOperationsEntitlements | where {$_.Name -eq $VSAN_LICENSE_ENTITLEMENT_NAME}).Id)
Set-VcfOperationsLicenseAssignment2 -VcenterId $VCENTER_ID -LicenseId $VCF_LICENSE_ID
Set-VcfOperationsLicenseAssignment2 -VcenterId $VCENTER_ID -LicenseId $VSAN_LICENSE_ID
Note: When assigning VCF addon entitlements such as vSAN, VCF core entitlements on that vCenter Server needs to be completed which can take a few seconds. If you attempt to run the VCF addon entitlement immediately after, it may return an error. Simply re-run the operation.
At this point everything should be licensed and you can verify that by logging into the VCF Operations UI and navigating to Manage->Licensing->Licensing & Registration
Similarly, if you login to the VCF BSC portal, you will see that VCF Operations has been fully registered and in compliance.
You will now have up to 180 days before you need to provide a usage report and then download an updated license entitlement from the VCF BSC portal.
Use the Download-VcfOperationsUsageFile function to generate a usage file from VCF Operations.
![]()
To upload the usage file into the VCF BSC portal , you will use the Import-VcfOperationsUsageFile function
![]()
After successfully importing the usage file, you can then download a new license entitlement file by using the same Download-VcfBscLicense function as shown in Step 12.


Thanks for the comment!