Hi all,
I would like to find out if any specific license is allocated to two different vcenters that are not in linked mode.
Could anyone help by providing a script for the same.
Thanks in advance.
Try something like this, it will show for each license key in which vCenters it is used.
You need to connect to all the vCenters before running the script
&{foreach($vc in $global:DefaultVIServers){
$si = Get-View ServiceInstance -Server $vc
$licMgr = Get-View -Id $si.Content.LicenseManager
$asgLicMgr = Get-View -Id $licMgr.LicenseAssignmentManager
foreach($esx in Get-VMHost -Server $vc){
$licAssigned = $asgLicMgr.QueryAssignedLicenses($esx.ExtensionData.MoRef.Value)
$esx | Select @{N='vCenter';E={$vc.Name}},
@{N='VMHost';E={$_.Name.Split('.')[0]}},
@{N='LicenseKey';E={$licAssigned[0].AssignedLicense.LicenseKey}}
}
}} | Group-Object -Property LicenseKey | %{
$vcs = $_.Group | Select -ExpandProperty vCenter | Sort-Object -Unique
Write-Output "License Key $($_.Name) is used in vCenters: $([string]::Join(',',$vcs))"
}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thank you Luc.. It works, am able to get all the licenses and its assigned vcenters.
But Can I get only the entry of license key that is assigned in two different vcenters.
Also it will be helpful if you could hide the content of license key like..
2DG45-xxxxx-xxxxx-xxxxx-FD53E
Try something like this
&{foreach($vc in $global:DefaultVIServers){
$si = Get-View ServiceInstance -Server $vc
$licMgr = Get-View -Id $si.Content.LicenseManager
$asgLicMgr = Get-View -Id $licMgr.LicenseAssignmentManager
foreach($esx in Get-VMHost -Server $vc){
$licAssigned = $asgLicMgr.QueryAssignedLicenses($esx.ExtensionData.MoRef.Value)
$esx | Select @{N='vCenter';E={$vc.Name}},
@{N='VMHost';E={$_.Name.Split('.')[0]}},
@{N='LicenseKey';E={$licAssigned[0].AssignedLicense.LicenseKey}}
}
}} | Group-Object -Property LicenseKey |
where{($_.Group | Select -ExpandProperty vCenter | Sort-Object -Unique).Count -gt 1} | %{
$vcs = $_.Group | Select -ExpandProperty vCenter | Sort-Object -Unique
Write-Output "License Key $(($_.Name.split('-')[0,4] -join '-xxxxx-xxxxx-xxxxx-')) is used in vCenters: $([string]::Join(',',$vcs))"
}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thanks a lot LucD...
Hi LucD,
I have executed the script after connecting to some 5 to 6 vcenters.
The output is showing some wrong values.
It displays as, some 3 to 4 license is being used in two different vcenters, I checked manually but it is not the case ( it is assigned to only one vcenter).
So I have rerun the script, this time it brings some other licenses stating it is assigned to two or more vcenters ( but this is also false, as I checked manually)
Can you please advice.
Hi,
Any suggestion to solve the issue please...
First you should check the content of $global:defaultviservers.
Are you connected to all vCenter when you run the script ?
When you run the script only connected to 1 vCenter, the one where you see the wrong licenses being reported, do you also see the incorrect assignments ?
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Q) First you should check the content of $global:defaultviservers.
Are you connected to all vCenter when you run the script ?
A) Yes, first i ran disconnect-viserver * and removed all existing connections.
Then connected to 6 vcenters one after other, then i executed the script.
Q) When you run the script only connected to 1 vCenter, the one where you see the wrong licenses being reported, do you also see the incorrect assignments ?
Eg : Consider the output
MM45T-XXXXX-XXXXX-XXXXX-KAL45 is assigned to vcenters abcd123, bcdh456,try678
I manually checked by exporting the licenses of vcenters and found that this license was not present in abcd123
but it was actually shared between the vcenters bcdh456 and try678
And one more point is, i get different outputs ( mentioning different license shared between vcenters, though it is wrong) when I execute the script multiple times ( each time i disconnect all vcenters and connect again to powercli)
Hope I answered your query,.
Any other info required LucD...
please let me know
Can you try this revised version ?
&{foreach($vc in $global:DefaultVIServers){
$si = Get-View ServiceInstance -Server $vc
$licMgr = Get-View -Id $si.Content.LicenseManager
$asgLicMgr = Get-View -Id $licMgr.LicenseAssignmentManager
foreach($esx in Get-VMHost -Server $vc){
$licAssigned = $asgLicMgr.QueryAssignedLicenses($esx.ExtensionData.MoRef.Value)
$esx | Select @{N='vCenter';E={$vc.Name}},
@{N='VMHost';E={$_.Name.Split('.')[0]}},
@{N='LicenseKey';E={$licAssigned[0].AssignedLicense.LicenseKey}}
}
}} | Group-Object -Property LicenseKey | %{
New-Object PSObject -Property @{
Key = $_.Name.split('-')[0,4] -join '-xxxxx-xxxxx-xxxxx-'
vCenters = ($_.Group | Select -ExpandProperty vCenter | Sort-Object -Unique) -join ','
nrvCenters = ($_.Group | Select -ExpandProperty vCenter | Sort-Object -Unique).Count
}
} | where{$_.nrvCenters -gt 1}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi LucD,
Thanks,
I tried to execute the new script after connecting to two vcenters, which has same license ( i assigned same license in both vcenters for testing purpose)
But I got result as below.
PowerCLI C:\License Scripts> .\test.ps1
PowerCLI C:\License Scripts>
i.e; I got two empty lines and then again the prompt.
In which vSphere version and with which PowerCLI version are you running this ?
Does this return all the licenses in both vCenters ?
&{foreach($vc in $global:DefaultVIServers){
$si = Get-View ServiceInstance -Server $vc
$licMgr = Get-View -Id $si.Content.LicenseManager
$asgLicMgr = Get-View -Id $licMgr.LicenseAssignmentManager
foreach($esx in Get-VMHost -Server $vc){
$licAssigned = $asgLicMgr.QueryAssignedLicenses($esx.ExtensionData.MoRef.Value)
$esx | Select @{N='vCenter';E={$vc.Name}},
@{N='VMHost';E={$_.Name.Split('.')[0]}},
@{N='LicenseKey';E={$licAssigned[0].AssignedLicense.LicenseKey}}
}
}}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi LucD,
Powercli version is as below
PowerCLI Version
----------------
VMware vSphere PowerCLI 5.1 Release 1 build 793510
---------------
Snapin Versions
---------------
VMWare AutoDeploy PowerCLI Component 5.1 build 768137
VMWare ImageBuilder PowerCLI Component 5.1 build 768137
VMware License PowerCLI Component 5.1 build 669840
VMware vSphere PowerCLI Component 5.1 build 793489
VMware vSphere Update Manager PowerCLI 5.1 build 782803
Vsphere version:
Vcenter 5.1 build 1473063
Yes the latest script is getting license from all the vcenters it is connected to...
Then it should work, that API method the script is using was introduced in vSphere 5.0.
If that script returns all the licenses with the correct vCenter, the grouping should work.
Does the following give the correct groups, check the Count property
&{foreach($vc in $global:DefaultVIServers){
$si = Get-View ServiceInstance -Server $vc
$licMgr = Get-View -Id $si.Content.LicenseManager
$asgLicMgr = Get-View -Id $licMgr.LicenseAssignmentManager
foreach($esx in Get-VMHost -Server $vc){
$licAssigned = $asgLicMgr.QueryAssignedLicenses($esx.ExtensionData.MoRef.Value)
$esx | Select @{N='vCenter';E={$vc.Name}},
@{N='VMHost';E={$_.Name.Split('.')[0]}},
@{N='LicenseKey';E={$licAssigned[0].AssignedLicense.LicenseKey}}
}
}} | Group-Object -Property LicenseKey | Format-List
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
LucD, today I was checking the output of your script which listed all the licenses for the connected vcenters.
I exported that and manually verified to find, there were licenses that are assigned to two different vcenters.
But when I manually verified by logging in the vcenters, I could find no such license is assigned in one of the vcenters.
Eg if I could see license 5J0C0-xxxxx-xxxxx-xxxxx-F8042 assigned to abcd123, bcdh567 on checking the output of the script.
But when I check in vcenter, I see 5J0C0-xxxxx-xxxxx-xxxxx-F8042 is assigned to abcd123 and some other license is assigned in bcdh567.
Hi LucD,
Please find below the part of the output of latest script.
The count value increases in two cases
Case 1: License allocated to ESXi host of two different vcenters
Case 2: License allocated to ESXi host of same vcenters ( as license is for 4 cpu and is shared between two number of 2 CPU host)
Case1:
Name : 0H6CL-xxxxx-xxxxx-xxxxx-21eP4
Count : 3
Group : {@{vCenter=vcenter1; VMHost=host1;
LicenseKey=0H6CL-xxxxx-xxxxx-xxxxx-21eP4},
@{vCenter=vcenter2; VMHost=host2;
LicenseKey=0H6CL-xxxxx-xxxxx-xxxxx-21eP4},
@{vCenter=vcenter2; VMHost=host3;
LicenseKey=0H6CL-xxxxx-xxxxx-xxxxx-21eP4}}
Values : {0H6CL-xxxxx-xxxxx-xxxxx-21eP4}
CASE 2:
Name : NM03H-xxxxx-xxxxx-xxxxx-8NLLN
Count : 2
Group : {@{vCenter=vcenter2; VMHost=host5;
LicenseKey=NM03H-xxxxx-xxxxx-xxxxx-8NLLN},
@{vCenter=vcenter2; VMHost=host7;
LicenseKey=NM03H-xxxxx-xxxxx-xxxxx-8NLLN}}
Values : {NM03H-xxxxx-xxxxx-xxxxx-8NLLN}
Hi LucD,
Hope you had a look at my update on the output I got for both the latest script provided by you.
Any input for me please..
Another version, can you try this one ?
$keys = foreach($vc in $global:DefaultVIServers){
$si = Get-View ServiceInstance -Server $vc
$licMgr = Get-View -Id $si.Content.LicenseManager
$asgLicMgr = Get-View -Id $licMgr.LicenseAssignmentManager
foreach($esx in Get-VMHost -Server $vc){
$licAssigned = $asgLicMgr.QueryAssignedLicenses($esx.ExtensionData.MoRef.Value)
$esx | Select @{N='vCenter';E={$vc.Name}},
@{N='VMHost';E={$_.Name.Split('.')[0]}},
@{N='LicenseKey';E={$licAssigned[0].AssignedLicense.LicenseKey}}
}
}
$keys | Group-Object -Property LicenseKey | %{
$_.Group | Sort-Object -Property vCenter -Unique |
Group-Object -Property vCenter |
where{$_.Count -gt 1} |
Select @{N='Licensekey';E={$_.Group[0].LicenseKey}},
@{N='Count';E={$_.Count}},
@{N='vCenter';E={[string]::Join(',',($_.Group | Select -ExpandProperty vCenter))}}
}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference