Get-WMIObject查询服务器列表的查询无效

时间:2016-03-12 23:47:15

标签: powershell

所以我试图对ADUC中的OU中的服务器列表运行powershell查询。这是代码:

$Serverlist = Get-ADComputer -Filter * -SearchBase ("OU=Member Servers, OU=KDHR, OU=RC South, DC=afghan, DC=swa, DC=ds, DC=army, DC=mil") | Select-Object -ExpandProperty Name

foreach ($Server in $Serverlist) {
$Server
$LastBootUpTime = Get-WmiObject Win32_OperatingSystem $Server | Select -ExpandProperty LastBootUpTime

Write-Host "$LastBootUpTime"

} 这是我得到的输出:

ServerName                                                                                                                                     
Get-WmiObject : Invalid query "select ServerName from Win32_OperatingSystem"
At C:\Users\Me\Desktop\LastReboot.ps1:6 char:19
+ $LastBootUpTime = Get-WmiObject Win32_OperatingSystem $Server | Select -Exp Last ...
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

看起来它试图将“Name = SameServerName”传递给我的Get-WMIObject cmdlet,而不是“SameServerName”。我提前输出服务器名称只是为了看看$ Server持有什么,它看起来是正确的,但是当它进入cmdlet时,它似乎在那里添加了“Name =”。知道为什么吗?

编辑:我刚刚意识到我在GetWmiObject cmdlet中遗漏了参数“-ComputerName”。所以现在这条线看起来像这样:

$LastBootUpTime = Get-WmiObject Win32_OperatingSystem -ComputerName $Server | Select -ExpandProperty LastBootUpTime

它现在正在运行,这很奇怪,因为之前我收到了“RPC is unavailable”错误。

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

foreach($ Get in(Get-ADComputer -Filter * -SearchBase(" OU = EachOUupFromTheServerOU,DC = DomainNameSplitUpByEachDotInTheDomain")) {

 $Servername = $Server.name

 $LastBootUpTime = Get-WmiObject Win32_OperatingSystem -Computername $Servername | Select -ExpandProperty LastBootUpTime

 Write-Output $LastBootUpTime

}

请记住,当您直接查询AD时,这将运行缓慢。最佳做法是使文本或csv文件中已列出服务器名称列表。

答案 1 :(得分:0)

由于修改了原文,因此会重写此答案。

为什么这是可怜的:

PS D:\Scripts> Get-WmiObject Win32_OperatingSystem {name=localhost}

Get-WmiObject : Invalid query "select name=localhost from 
Win32_OperatingSystem"
At line:1 char:1
+ Get-WmiObject Win32_OperatingSystem {name=localhost}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], Management 
   Exception
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.C 
   ommands.GetWmiObjectCommand

让我们假设Windows Management Instrumentation有一点线索,但其余部分不知道。什么是' Win32_OperatingSystem'和' {name = localhost}'在那里:

Get-Help -Name 'Get-WmiObject' -Online

基本上,首先检查文档。俏皮话'较短的变体是:

help gwmi

但这说明了一点:严格遵守参数及其价值。知道没有位置的参数可以通过命名它们来估价。一般来说,位置参数接受像帮助gwmi'这样的东西,但是错误的Get-WmiObject-cmdlet并没有那么好地工作。大多数具有俗气功能的cmdlet都是如此:具体到您想要的内容。

通过声明参数来命令PowerShell,除非您无可置疑地确定所有位置。哎呀,-ComputerName甚至不是这个cmdlet的第二个位置参数。类是第一个,这是正确的,但其余的是错误中陈述的。因此,“无效声明”类别中出现错误,请将您的shell粉碎,然后重试:

PS D:\Scripts> Get-WmiObject -Class Win32_OperatingSystem -ComputerName {name=localhost}
Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 
0x800706BA)
At line:1 char:1
+ Get-WmiObject -Class Win32_OperatingSystem -ComputerName {name=localh ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMExcept 
   ion
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands 
   .GetWmiObjectCommand 

了解详细信息,您认为名称类似于' {e / ndp%01n!}'存在于网络上?也不是{localhost}',因此它应该是本地主机',数据类型尽可能简单。

在未经编辑的问题中,提到了第一个问题。显示" ... {name = ServerName} ..."的值对于需要基元' ServerName'的参数是无效的,因此它会中断。这些东西是从hash table迭代的。为什么?因为Get-ADComputer的输出与几乎所有其他PowerShell cmdlet一样,是各种数据结构的组合。从对象中选择特定属性,并将该特定属性扩展为新对象仍然存在差异。