所以我试图对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”错误。
答案 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一样,是各种数据结构的组合。从对象中选择特定属性,并将该特定属性扩展为新对象仍然存在差异。