2016-03-12 96 views
-1

所以我試圖對ADUC中的OU中的服務器列表運行PowerShell查詢。下面的代碼:Get-WMIObject無效的查詢查詢列表a服務器

$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不可用」的錯誤。

回答

0

嘗試以下方法:在(GET-ADComputer -Filter * -SearchBase( 「OU = EachOUupFromTheServerOU,DC = DomainNameSplitUpByEachDotInTheDomain」))

的foreach($服務器 {

$Servername = $Server.name 

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

Write-Output $LastBootUpTime 

}

請記住,這將運行緩慢因爲你是直接查詢AD。最好的做法是在文本或CSV文件中已經列出的服務器名稱的列表。

+0

嗯,這確實改變了什麼是越來越投入該cmdlet,但它仍然會給出確切的同樣的錯誤。 – Joseph

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 

基本上,先檢查文檔。 Wisecracks'較短的變體是:

help gwmi 

但是這說明了一點:對參數和它們的值要嚴格。知道沒有職位的參數,可以通過命名他們來估價。一般來說,位置參數接受諸如'help gwmi'之類的東西,但錯誤的Get-WmiObject-cmdlet並沒有很好地工作。正如大多數具有俗氣功能的cmdlet一樣:具體以您想要的形式爲準。

A L W進行陳述的參數,除非你是無可爭議確保所有位置的Ÿ指揮的PowerShell。哎呀,-ComputerName甚至不是此cmdlet的第二個位置參數。類是第一個,這是正確的,但其餘的,在錯誤中說得很清楚。因此,在「InvalidArgument」的類別中的錯誤,所以塵你的殼,然後再試一次:

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}'也不是,因此它應該是'localhost',這是一種儘可能簡單的數據類型。

說到,在未經編輯的問題,即闡明瞭第一個問題。向需要原語「ServerName」的參數呈現「... {name = ServerName} ...」的值是無效的,因此它會中斷。這些東西是從hash table迭代的。爲什麼?由於Get-ADComputer的輸出與幾乎所有其他PowerShell cmdlet一樣,都是各種數據結構的組合。從對象中選擇特定的屬性並將該特定屬性擴展爲新對象仍然存在差異。

+0

我看到了散列表,但我試圖找出可能發生的原因,特別是因爲我把「Select-Object Name」放在最後。 – Joseph

+0

這只是格式化。具體細節看PowerShell的文件夾中的文件.ps1xml(但保存供以後;) 儘量選擇-對象-ExpandProperty「名稱」,而不是選擇-對象,物業「名稱」 –

+0

這確實改變了輸入的方式正在被放入cmdlet中,這很有趣。錯誤仍然是相同的。 – Joseph