Vmware 使用Powershell/PowerCLI的vCenter VM权限查询

Vmware 使用Powershell/PowerCLI的vCenter VM权限查询,vmware,powercli,Vmware,Powercli,我一直在尝试将Powershell与导入的PowerCLI命令一起用于VMware管理,但遇到了一个障碍。我试图做的是查询一个位置(无论在何处)中的所有VM,对于每个VM,我希望该组具有“Virtual Machine User with Snapshot”权限,然后使用该组名称为该组中的每个人运行Get-ADGroupMembers查询。我还必须从AD查询中删除域前缀,否则会导致错误 在将哈希表信息输出到csv(与“SystemObject[]”相反)中进行了更多的尝试之后,我终于得到了脚本,

我一直在尝试将Powershell与导入的PowerCLI命令一起用于VMware管理,但遇到了一个障碍。我试图做的是查询一个位置(无论在何处)中的所有VM,对于每个VM,我希望该组具有“Virtual Machine User with Snapshot”权限,然后使用该组名称为该组中的每个人运行Get-ADGroupMembers查询。我还必须从AD查询中删除域前缀,否则会导致错误

在将哈希表信息输出到csv(与“SystemObject[]”相反)中进行了更多的尝试之后,我终于得到了脚本,这样它就不会返回错误,除非在VM上有多个组。它抛出一个错误,但脚本继续,只输出第一个组的成员

如何让它对拉入owner groups哈希表的每个组执行递归AD查询?输出将与所有其他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

$owner.principal
更改为
$owner.principal
之后的
$members=Get ADGroupMember
?如果您有嵌套的广告组,那么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

比较两者,这似乎是我需要做的改变之一-谢谢!