2013-07-10 2 views
1

Пытается перечислить права пользователей на общих ресурсах на сервере, где путь общего доступа содержит в нем общий путь к файлу.Powershell - Как использовать результат одного запроса WMI в другом запросе WMI?

У меня есть сценарий, который успешно использует класс WMI Win32_LogicalShareSecuritySetting для перечисления разрешений общего доступа ко всем общим ресурсам на сервере, но, к сожалению, у этого класса нет пути к файлу ресурса в качестве атрибута ... Я могу использовать 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; он не работает, потому что он не возвращает имя, как вы ожидаете. Попробуйте просто поставить «$ ShareInst» внутри вашего цикла foreach; Вы должны увидеть такие вещи, как:

\ COMPUTERNAME \ корень \ cimv2: Win32_Share.Name = "ADMIN $"

Что является PATH объекта WMI, а не его имя. Что вы имеете в $ ShareInst - это объект типа System.Management.ManagementObject # root \ cimv2 \ Win32_Share, а не строка. Когда вы вставляете эту переменную в двойные кавычки, PowerShell расширяет эту переменную в строку, используя метод .ToString(). Что в случае этого объекта Win32_Share возвращает PATH объекта, а не имя.

Так что вам просто нужно получить фактическую строку имени в строке -Filter, чтобы она фактически вернула объект безопасности общего доступа, который вы ищете. Есть несколько способов сделать это:

Вставить имя свойства в строке, например, так:

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

В $() обертка говорит PowerShell оценить свойство .Name до расширения переменной в том, что долго PATH, поэтому вы получите только краткое имя, которое вы ищете.

Если вам просто нужно объекты Win32_Share для имени, то вы можете просто изменить Еогеасп строку выглядеть следующим образом:

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

Параметр -ExpandProperty в Select-Object говорит PowerShell, чтобы получить имя свойство каждого объекта и просто вернуть это, а не полный объект. Теперь $ ShareInst будет просто именем Win32_Share, поэтому вы можете оставить свой фильтр как есть.

Есть много других способов решения этой проблемы, но эти два кажутся мне наиболее прямолинейными.

+0

Спасибо @jbsmith! Параметр '-ExpandProperty' для' Select-Object' сделал трюк. –

Смежные вопросы