与许多其他人一样,我的背景是Linux,没有PowerShell经验。因此,这种面向对象的编程让我感到困惑。
我需要在分配给用户的VMware Horizon for VMs中进行搜索,然后检查它们是否在AD中被禁用。如果在AD中禁用它们,我想要回收VM。
目前我正在从VMware Horizon中为用户提取SID,但当我尝试在针对AD的invoke命令中使用这些时,我收到以下错误
"对象引用未设置为对象的实例"
到目前为止的剧本
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}
答案 0 :(得分:0)
所以这种面向对象的编程让我感到困惑。
因此,您尝试恢复到shell脚本,并编写两倍的代码来完成一半的工作。
您最不重要的一点是将对象想象成一组事物 - 比如,假设您正在使用/etc/passwd
并且每行都有一个用户ID 和一个组ID 和一个主目录和一个登录shell ..并且你一次性传递整条线路,那就是' s你的类似物体。
一个对象有很多属性,就像那样(但总体上更有能力)。
当您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.
}
因为函数不返回任何内容,并且它不会更改磁盘上的任何数据或任何内容,所以当函数完成后,变量将被清除内存,之后您就无法使用它们。 / p>
此:
if ($test -eq "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
}
现在您拥有所有VM,获得用户启用/禁用状态
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 Desktop属性 - 以及该用户帐户的AD Enabled属性的True / False状态。
$VM | Out-Gridview
或
$VM | Export-Csv Report.csv
或
$VM | Where-Object { -not $_.AdEnabled }