使用 Powershell / PowerCLI 查询 vCenter VM 权限

vCenter VM permission query using Powershell / PowerCLI

我一直在尝试将 Powershell 与导入的 PowerCLI 命令结合使用以进行 VMware 管理,但遇到了麻烦。我想做的是查询某个位置的所有虚拟机(无论在哪里),对于每个虚拟机,我希望该组具有 "Virtual Machine User with Snapshot" 权限,然后将该组名用于 运行该组中每个人的 Get-ADGroupMembers 查询。我还必须从 AD 查询中删除域前缀,否则会导致错误。

经过更多尝试将散列 table 信息输出到 csv 中,而不是 'SystemObject[]',我终于得到了脚本,因此它不会 return 错误,除了有多个组的虚拟机。它抛出一个错误,但脚本继续执行,并且只输出第一组的成员。

如何让它对拉入所有者组哈希的每个组执行递归 AD 查询table?输出将与所有其他 VM 相同,只是每个组和成员都有一行。

$AllVMs = @()
$vms = get-vm  * -Location datacenter
foreach ($vm in $vms)
    {
        $owners = Get-VIPermission $vm.name | where-object {$_.role -eq "virtual machine user with snapshot"}   
        foreach ($owner in $owners) 
            {
            $members = Get-ADGroupMember ($owners.principal -replace '^prefix\')

        $temp = New-Object psobject |
        Add-Member Noteproperty "Name" -value $vm.name -PassThru |
        Add-Member Noteproperty "Owner" -value (@($owners.principal) -join ',') -PassThru |
        Add-Member Noteproperty "Members" -value  (@($members.SamAccountName) -join ',') -passthru
        $AllVMs+=$temp
    }
$AllVMs | Export-Csv -Path c:\users\me\desktop\AllVMs.csv

$members = Get-ADGroupMember之后把$owners.principal改成$owner.principal?如果您有嵌套的 AD 组,Get-ADGroupMember 有一个 -Recursive 参数。

我今天又玩了一会儿,弄明白了!我现在是 运行 针对拥有 350 多台机器的数据中心的脚本,所以从技术上讲我不知道 100% 它是否有效,但它适用于 3 台机器:-) 我还添加了一行来列出每台机器由多个团体拥有 - 方便进行故障排除。这是脚本:

$AllVMs = @()
$vms = get-vm -Location DATACENTER
foreach ($vm in $vms)
    {
        $owners = @(Get-VIPermission $vm.name | where-object {$_.role -eq "virtual machine user with snapshot"})
        if ($owners.count -gt 1) {write-host "** Note ** '$vm' has"$owners.count "owner groups"}
        foreach ($owner in $owners)
            {
                $members = Get-ADGroupMember ($owner.principal -replace '^prefix\')
                $temp = New-Object psobject |
                Add-Member Noteproperty "Name" -value $vm.name -PassThru |
                Add-Member Noteproperty "Owner" -value (@($owner.principal) -join ',') -PassThru |
                Add-Member Noteproperty "Members" -value  (@($members.SamAccountName) -join ',') -PassThru
                $AllVMs+=$temp
            }
    }

$AllVMs