2013-07-10 55 views
1

試圖列出共享路徑中共享文件路徑元素的服務器上共享的用戶權限。Powershell - 如何在另一個WMI查詢中使用一個WMI查詢的結果?

我有一個成功使用Win32_LogicalShareSecuritySetting WMI類來枚舉服務器上所有共享的共享權限的腳本,但不幸的是該類沒有共享的文件路徑作爲屬性...我可以使用在Win32_Share類做類似:

$FinShares = Get-WmiObject -Class Win32_Share -Filter "Path LIKE '%Finance%'" -ComputerName $computername 

和我得到預期的股票的列表。但是如何將該列表傳遞給下一個Get-WmiObject語句?我已經試過類似:

$FinShares = (Get-WmiObject -Class Win32_Share -Filter "Path LIKE '%Finance%'" -ComputerName $computername | Select-Object Name) 

foreach ($ShareInst in $FinShares) 
    { 
    $FinShareSS = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter "Name = '$ShareInst'" -ComputerName $computername 
    $SecurityDescriptor = $FinShareSS.GetSecurityDescriptor() 
(...) 

當我嘗試,變量$FinShareSS保持爲空...有人可以給我一個指針(或某種乾脆更好的方式),我怎麼能做到這一點?

回答

2

問題是你的過濾器使用$ ShareInst;它不起作用,因爲它沒有像您期望的那樣返回名稱。嘗試在你的foreach循環中放入「$ ShareInst」;你應該看到的東西,如:

\計算機名\ ROOT \ CIMV2:Win32_Share.Name = 「$ ADMIN」

這是WMI對象的路徑,而不是它的名字。您在$ ShareInst中擁有的是System.Management.ManagementObject#root \ cimv2 \ Win32_Share類型的對象,而不是字符串。當你將該變量放在雙引號內時,PowerShell使用對象.ToString()方法將該變量擴展爲一個字符串。在這個Win32_Share對象的情況下,返回對象的PATH,而不是名稱。

所以基本上你只需要在-Filter字符串中得到實際的名稱字符串,以便它實際上會返回你正在尋找的共享安全對象。有幾種方法可以做到這一點:

嵌入屬性名字符串中,像這樣:

-Filter "Name = '$($ShareInst.Name)'" 

的$()包裝告訴PowerShell的擴展變量成很久以前的,請將.Name財產評估路徑值,所以你只需要找到你想要的短名稱。

如果你只需要在名稱中Win32_Share對象,那麼你可以改變的foreach線看起來像這樣:

foreach ($ShareInst in ($FinShares | Select-Object -ExpandProperty Name)) 

選擇-對象的-ExpandProperty參數告訴PowerShell來獲取名稱每個對象的屬性,只是返回,而不是完整的對象。現在$ ShareInst將只是Win32_Share的名稱,因此您可以保留原來的過濾器。

解決此問題的方法有很多,但這兩種方法對我來說似乎是最直接的。

+0

謝謝@ jbsmith! 'Select-Object'的'-ExpandProperty'參數完成了這個任務。 –

相關問題