使用Powershell / PowerCLI进行vCenter VM权限查询

时间:2016-01-13 21:12:39

标签: vmware powercli

我一直在尝试将Powershell与导入的PowerCLI命令一起用于VMware管理,我遇到了麻烦。我要做的是查询某个位置的所有虚拟机(无论在哪里),对于每个我希望该组具有“具有快照的虚拟机用户”权限的虚拟机,然后使用该组名运行获取-ADGroupMembers查询该组中的每个人。我还必须从AD查询中删除域前缀,否则会导致错误。

在更多地讨论将输入哈希表信息输出到csv之后,与'SystemObject []'相反,我终于得到了脚本,因此它不会在有多个组的VM上返回错误EXCEPT。它抛出一个错误,但脚本继续,只输出第一组的成员。

如何让它为每个被拉入所有者组哈希表的组执行递归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

2 个答案:

答案 0 :(得分:1)

今天我正在玩它,并想出来了!我现在正在对一台拥有350多台机器的数据中心运行该脚本,所以从技术上来说,我不知道它有效,但它对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

答案 1 :(得分:0)

$owners.principal之后将$owner.principal更改为$members = Get-ADGroupMember?如果您有嵌套的AD组,则Get-ADGroupMember具有-Recursive参数。