0

像许多其他人一样,我的背景是 Linux,没有 powershell 经验。所以这个面向对象的编程把我搞砸了。

我需要在 VMware Horizo​​n 中搜索分配有用户的 VM,然后检查它们是否在 AD 中被禁用。如果它们在 AD 中被禁用,我想回收 VM。

目前我正在从 VMware Horizo​​n 中为用户提取 SID,但是当我尝试在针对 AD 的调用命令中使用这些 SID 时,我收到以下错误

“你调用的对象是空的”

到目前为止的脚本

function getlist() {
$temp=Invoke-Command -ComputerName $vdiserver -ScriptBlock { add-pssnapin vmware.view.broker; get-desktopvm | select user_sid }
$list=$temp | Select-Object user_sid
#$list
}
$vdi1="server1"
$vdi2="server2"
$test=Test-Connection -ComputerName $vdi1 -Quiet
$test2=Test-Connection -ComputerName $vdi2 -Quiet
if ($test -eq "True"){
$vdiserver=$vdi1
getlist
}
elseif ($test2 -eq "True"){
$vdiserver=$vdi2
getlist
}
else {echo "No servers to connect to"}

ForEach ($user in $list) #{
#echo $user
#sleep 1
#}
{Invoke-Command -ComputerName domaincontroller -ScriptBlock {param($p1) get-aduser -identity $p1 } -argumentlist $user}
4

1 回答 1

0

所以这个面向对象的编程把我搞砸了。

因此,您尝试恢复为 shell 脚本,并编写两倍的代码来完成一半的工作。

您缺少的最重要的一点是将对象想象为事物的集合-例如,想象您正在使用,/etc/passwd并且每一行都有一个用户 ID一个组 ID以及一个主目录一个登录 shell.. '正在一次通过整条线,那是您的类似对象。

一个对象有很多属性,就像那样(但总体上更有能力)。

当您Select user_sid选择该字段留在“行”中时,该行仍然:::user_sid::::与其他字段一样,现在为空。(大约)。但它们仍然存在并且挡在路上。要直接使用它,您必须将它完全从“线”中取出 - 将容器扔掉,只将 user_sid 放在它外面。

get-desktopvm | select user_sid

->

get-desktopvm | select -expandproperty user_sid

这使得"sid1", "sid2", "sid3",但每个 sid 没有容器。


这个

function getlist() {
    $temp=Invoke-Command -ComputerName $vdiserver -ScriptBlock { add-pssnapin vmware.view.broker; get-desktopvm | select user_sid }
    $list=$temp | Select-Object user_sid
}

本质上是说

function getlist() {
    #do any amount of work here, and throw it all away.
}

因为函数什么都不返回,也不改变磁盘上的任何数据或任何东西,所以当函数完成时,变量会从内存中清除,之后你就不能使用它们了。


这个:

if ($test -eq "True"){

有点胡说八道。它可能会起作用,但它不会像您期望的那样起作用,因为与布尔值 True 相比,“具有内容的字符串”是 True 是偶然的,无论字符串是否包含英文单词“True”。但它也是多余的——$test它本身是真还是假,你不需要将 True 与任何东西进行比较。 if ($test). 甚至if (Test-Connection -ComputerName $vdi -Quiet)


但是仍然,工作量很大。只需将它们全部连接起来,让它为无法联系的那些失败。-ErrorAction SilentlyContinue如果您不想看到错误,可以添加。

$VMs = Invoke-Command -ComputerName Server1,Server2 -ScriptBlock { 
    Add-PsSnapin vmware.view.broker
    Get-DesktopVm 
} 

现在您拥有所有虚拟机,获取用户启用/禁用状态

foreach ($VM in $VMs) {

    $Sid = $VM.user_sid

    $AdEnabled = Invoke-Command -ComputerName domaincontroller -ScriptBlock {
        (Get-AdUser -Identity $using:Sid).Enabled
    }

    $VM| Add-Member -NotePropertyName 'AdEnabled' -NotePropertyValue $AdEnabled

}

现在,理想情况下,您应该将 $VM 作为对象数组,每个对象都具有所有 VM 桌面属性 - 以及该用户帐户的 AD Enabled 属性的 True/False 状态。

$VM | Out-Gridview

或者

$VM | Export-Csv Report.csv

或者

$VM | Where-Object { -not $_.AdEnabled }
于 2017-06-21T22:19:37.110 回答