我正在学习创建新对象并组合其他对象的属性。在这个脚本中,我想找出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
答案 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