使用 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
我一直在尝试将 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