通过在Vmware Horizon (PowerCLI)中输入用户名获取分配的虚拟机名称



我一直在编写一个PowerShell代码,从所有桌面池中获取虚拟机名称。

我正在使用PowerCLI并安装了PowerShell 7。

我已经设法得到了所有用户和他们分配的机器的输出。但是,我在优化代码时遇到了困难,我可以输入单个用户名,它只会显示该用户分配的VM。

这是我目前得到的代码

#Import-Module VMware.VimAutomation.Core
#Import-Module Activedirectory
Connect-VIServer -server servername123 -Force
Connect-HVServer -server server.name.123
$uname = Read-Host -Prompt 'Input the user name you wish to find:' #User-Input
$Global:DefaultHVServers
$query = New-Object "Vmware.Hv.QueryDefinition"
$query.queryEntityType = 'SessionLocalSummaryView'
$qSrv = New-Object "Vmware.Hv.QueryServiceService"

$PCs = ($qSRv.QueryService_Query($global:DefaultHVServers[0].ExtensionData,$query) | 
Select -ExpandProperty Results |
Select -ExpandProperty NamesData |
Select-Object -Property UserName,MachineOrRDSServerName)

$PCs | % {"$($_.UserName.Split("")[1]) `t`t $($_.MachineOrRDSServerName) "}

在代码的最后一行,我格式化表格以删除不必要的内容。

$PCs | % {"$($_.UserName.Split("")[1]) `t`t $($_.MachineOrRDSServerName) "}

有人可以帮助我从控制台抓取用户名,只显示他们分配给的虚拟机吗?

我试着在谷歌上搜索解决方案,但找不到任何相关的。

谢谢! !

注意我已经声明了一个变量uname,但还没有使用它。我不确定在这个用例中如何使用它。

在最深处的子区挖掘了更多之后,我发现了一个帖子,解决了我的问题。

https://www.reddit.com/r/vmware/comments/d547nt/horizon_view_powercli_help/

下面是使用QueryFilterEquals的代码从VMware.Hv.Equals类获取用户名及其属性。

我跳过代码的连接部分,它与问题中提到的相同。

#Get User Input for UserName
$UserName = Read-Host -Prompt 'Input the user name you wish to find:'
#Create Horizon Services object
$HorizonServerServices = $global:DefaultHVServers[0].ExtensionData
#Create Query Definition object with EntityType SessionLocalSummaryView
$HorizonQuery = New-Object VMware.Hv.QueryDefinition
$HorizonQuery.QueryEntityType = 'SessionLocalSummaryView'
#Create Query Filter Object
$QueryFilterEquals = New-Object VMware.Hv.QueryFilterEquals
$QueryFilterEquals.MemberName = 'namesData.userName'
$QueryFilterEquals.value = "domain.loc$UserName"

$HorizonQuery.Filter = $QueryFilterEquals
$HorizonQueryService = New-Object VMware.Hv.QueryServiceService
$SearchResult = $HorizonQueryService.QueryService_Query($HorizonServerServices, $HorizonQuery)
if ($SearchResult.Results)
{
$SearchResult.Results.Namesdata
}

我们不需要在最后删除查询,因为它不消耗任何服务器端资源。这是一个虚拟查询。有关QueryService工作原理的详细信息,请参阅下面给出的链接。

参考:https://vdc-download.vmware.com/vmwb-repository/dcr-public/e2e25628-4ed2-43fc-8bad-54fb86f3bb0f/8e4d2491-c740-4778-ac43-ba8fc0ec8175/doc/queries-landing.html