Как правильно назначить указатель на массив фиксированного размера - PullRequest
0 голосов
/ 10 марта 2020

Я использую функцию моделирования групповой политики консоли управления групповой политикой в ​​Microsoft Windows Server 2019 для программного создания результирующего набора запросов политики в PowerShell. GPM C выставляется через ком-объект. Я очень мало знаю о COM или о C ++, в котором написана документация (от Microsoft) о COM-объекте.

"Параметр pvarVal содержит фильтры WMI для связи с компьютер во время моделирования режима планирования. Свойство PlanningComputerWMIFilters возвращает SAFEARRAY, который содержит элементы VARIANT. Каждый VARIANT содержит указатель Dispatch на интерфейс IGPMWMIFilter. "

Проблема, которую я пытаюсь преодолеть, заключается в том, что запрос не соответствует Фильтры запросов WMI Я ожидаю применения к нему. В блоке кода ниже показаны четыре фильтра WMI, возвращенные из AD. (Фильтры работают нормально).

Я не получаю сообщений об ошибках в консоли PowerShell или PowerShell ISE. Я попробовал множество вещей, которые я объясню после показа кода, который я использую.

Вот код, который я использую.

$GPPath = 'OU=Test,DC=Test,DC=com'

[bool]$html = $true

if ($html)
{
    $outPutFile = "$env:temp\$($GpPath.Replace(',','-')).html"
}
else
{
    $outPutFile = "$env:temp\$($GpPath.Replace(',','-')).xml"
}

$gpm = New-Object -ComObject GPMgmt.GPM
$constants = $gpm.GetConstants()
$objGPMDomain = $gpm.GetDomain($env:USERDNSDOMAIN,"",$constants.UseAnyDC)
$objGPMSearchCriteria = $gpm.CreateSearchCriteria()
$wmiFilterList = $objGPMDomain.SearchWMIFilters($objGPMSearchCriteria)
$gpmRSOP = $GPM.GetRSOP($constants.RSOPModePlanning,$null,0)
$gpmRSOP.PlanningDomainController = $objGPMDomain.DomainController
$gpmRSOP.PlanningComputer = "test\9WTJ992"
$gpmRSOP.PlanningFlags += $constants.RsopPlanningAssumeCompWQLFilterTrue
$gpmRSOP.PlanningComputerWMIFilters += $wmifilterlist
$gpmRSOP.CreateQueryResults()

if ($Html)
{
    $gpmRSOP.GenerateReportToFile($constants.ReportHTML, $outPutFile)
}
else
{
    $gpmRSOP.GenerateReportToFile($constants.ReportXML, $outPutFile)
}

$gpmRSOP.ReleaseQueryResults()
invoke-item $outPutFile

Суть проблемы, кажется, вращается вокруг эти две строки кода.

$gpmRSOP.PlanningFlags += $constants.RsopPlanningAssumeCompWQLFilterTrue
$gpmRSOP.PlanningComputerWMIFilters += $wmifilterlist

Поведение первой строки, по-видимому, состоит в том, что к запросу не применяются фильтры WMI. Удаление этой строки вызывает применение всех фильтров WMI к запросу. Я могу назначить массив списка wmifilter (PowerShell сообщает о нем как массив) параметру $ GpmRsop.PlanningComputerWMIFilters только с помощью оператора + =.

Все другие обычные методы приращения массива не работают. x.add x = et c. все терпят неудачу с "коллекцией фиксированного размера". Так что + = это единственный рабочий (PowerShell) метод, который я нашел. Я могу видеть объекты com__, перечисленные в массиве, например {com __, com__}, когда я возвращаю список свойств, но почему-то не получается, чтобы окончательный результат отражал «выбранные» запросы фильтра WMI. , Он ведет себя так, как будто фильтры WMI не были выбраны или применены к запросу. В документации говорится о переменных и указателях на сами фильтры WMI, как они возвращаются из AD. Я не совсем уверен, не будучи полностью C осведомленным, есть ли какие-то другие шаги, которые я должен предпринять, чтобы правильно назначить их.

Я могу выбрать один запрос WMI в моей переменной $ Wmifilterlist и выполнить все определенные методы против него успешно. Это дает мне уверенность в этих типах объектов.

Я был бы рад, если бы кто-нибудь мог воспроизвести и объяснить мне, как необходимо выполнить назначение, чтобы соответствующие фильтры WMI, которые я пытаюсь использовать, были уважал.

...