无法获得其他域名和PS版本的成员

时间:2016-08-09 14:23:48

标签: powershell active-directory

我正在学习创建新对象并组合其他对象的属性。在这个脚本中,我想找出PS版本是什么,并添加一些其他属性,如操作系统,IP等...但我遇到了2个问题。我们有6个域名,我似乎无法遍历每个域名。我尝试了(Get-ADForest).Domains,可以查看域名列表。它仍然只返回我的工作站所属域中的对象。第二个问题是Invoke-Command。版本总是返回5.我知道许多返回的服务器没有PSVersion 5.

function Get-PSVersion {
    (Invoke-Command -Scriptblock {$PSVersionTable.PSVersion}) | Select Major
}

$servers = Get-ADComputer -Filter {(enabled -eq $true) -and (OperatingSystem -like "Windows Server* *")} -Properties * |
           ForEach-Object {
               $ps = Get-PSVersion
               $server = $_

               New-Object -TypeName PSObject -Property @{
                   Name      = $server.Name
                   OS        = $server.OperatingSystem
                   IPAddress = $server.IPv4Address
                   Location  = $server.CanonicalName
                   PSVersion = $ps.Major
               }
           }
$servers | Select Name,Location,OS,IPAddress,PSVersion | FT -AutoSize

2 个答案:

答案 0 :(得分:1)

好的,从Invoke-Command开始,您需要告诉cmdlet要定位哪个服务器,只需在循环服务器名称时调用它将继续在本地计算机上调用它,因此您需要使用-computername参数,并为您的函数提供一个传递给invoke-command的参数。看起来像这样:

function Get-PSVersion($name) {
    (Invoke-Command -ComputerName $name  -Scriptblock {$PSVersionTable.psversion | Select Major})
}

您会注意到我也移动了您的选择,这不是严格必要的,但它看起来更清晰,意味着通过网络发送的数据略少。请注意,这将创建一个具有名为Major的单个属性的对象,如果您只想将版本号作为整数返回,则您希望像这样做

function Get-PSVersion($name) {
    (Invoke-Command -ComputerName $name  -Scriptblock {$PSVersionTable.psversion.Major})
}

如果你想要定位多个域,你需要在脚本中添加一个额外的循环,基本上你想要一个你希望定位的域数组,然后遍历那个调用get-adcomputer的数组。 each并指定-server参数的域名。我在下面放了一个简化示例,您可以将其合并到您自己的代码中。

$arr = @("test.domain","othertest.domain")

    foreach($domain in $arr){
    Get-ADComputer -Filter * -Server $domain
}

希望有所帮助!

答案 1 :(得分:0)

让它发挥作用。谢谢你的帮助。

clear-host
$arr = @("x.local","x.local")

foreach($domain in $arr){
$servers = (Get-ADComputer -Filter {(enabled -eq $true) -and (OperatingSystem -like "Windows Server* *")}-Server $domain -Properties *|Select -First 10)
}
$MasterList = @()
foreach ($server in $servers) {
$MyObj = New-Object PSObject -Property @{
Name = $server.Name
Os   = $server.OperatingSystem
Ip   = $server.IPv4Address
PSV  = Invoke-Command -ComputerName $server.Name -ScriptBlock {$PSVersionTable.psversion}
}
$MasterList += $MyObj
}
$MasterList|Select Name,PSV,OS,IP