【问题标题】:vCenter VM permission query using Powershell / PowerCLI使用 Powershell / PowerCLI 查询 vCenter VM 权限
【发布时间】:2016-01-13 21:12:38
【问题描述】:

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

在尝试将哈希表信息输出到 csv(而不是“SystemObject[]”)之后,我终于得到了脚本,因此它不会返回错误,除非在有多个组的 VM 上返回错误。它会引发错误,但脚本会继续执行,并且只输出第一组的成员。

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

【问题讨论】:

    标签: vmware powercli


    【解决方案1】:

    我今天又玩了一些,然后弄明白了!我现在正在对一个拥有 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 比较两者,看起来这是我需要做的改变之一 - 谢谢!
      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多