从一个PSSession获取输入并将其发送到另一个PSSession

时间:2017-06-21 20:21:32

标签: powershell invoke-command horizon

与许多其他人一样,我的背景是Linux,没有PowerShell经验。因此,这种面向对象的编程让我感到困惑。

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

目前我正在从VMware Horizo​​n中为用户提取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}

1 个答案:

答案 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 }
相关问题