Этот класс WMI каким-то образом нарушен. К счастью, есть обходной путь, хотя он требует немного больше работы. Вам нужно будет загрузить Windows Search 3 SDK . Это просто самораспаковывающийся ZIP, и вы можете помещать файлы куда угодно. Мы заинтересованы только в одном, Microsoft.Search.Interop.dll
в папке Managed. Загрузите эту DLL в PowerShell:
Add-Type -Path "Microsoft.Search.Interop.dll"
Тогда вам нужен объект менеджера поиска . Если вы хотите получить тот для локальной машины, это просто так:
$manager = New-Object Microsoft.Search.Interop.CSearchManagerClass
Если вы хотите получить доступ к удаленной машине, пришло время для объезда.
Нам понадобится GUID класса COM, который я где-то извлек из заголовка C:
$guid = New-Object guid ""
И мы создадим тип COM таким образом, что Windows сделает RPC за нас:
$managerType = [Type]::GetTypeFromCLSID($guid, $targetMachine, $true)
Определить тип:
$comManager = [Activator]::CreateInstance($managerType)
Превратите этот COM-объект обратно в обычный .NET-объект:
$manager = [System.Runtime.InteropServices.Marshal]::CreateWrapperOfType($comManager, [Microsoft.Search.Interop.CSearchManagerClass])
Обход завершен. Теперь этот объект будет ссылаться на менеджер поиска целевой машины.
Затем получите объект каталога для основного каталога:
$cat = $manager.GetCatalog("SystemIndex")
GetCatalogStatus
Функция сообщает вам, будь то в настоящее время индексации, но эта функция использует «выход» параметры, поэтому мы должны передать ссылки:
$indexStatus = 0 $indexPauseReason = 0 $cat.GetCatalogStatus([ref]$indexStatus, [ref]$indexPauseReason)
Эти две переменные теперь содержат неопределенно читаемый статус, если вы заставляете их быть строками. [string]$indexStatus
В настоящее время производит CATALOG_STATUS_PAUSED
для меня. Если индексатор приостановлен, эта вторая переменная является причиной, по которой он не работает.
Получить количество проиндексированных элементов довольно просто:
$cat.NumberOfItems()
Предположительно, Windows выполняет индексацию, когда для индексирования больше ничего не осталось, поэтому мы будем использовать NumberOfItemsToIndex
функцию, опять же со ссылками:
$incrementalCount = 0 $notificationQueue = 0 $highPriQueue = 0 $cat.NumberOfItemsToIndex([ref]$incrementalCount, [ref]$notificationQueue, [ref]$highPriQueue)
Если все три из этих переменных получаются нулевыми, то индексация завершена.
Все эти функции дают ожидаемые / правильные результаты в Windows 8.1, в то время как WMI делает для меня то же самое, что и для вас.