Essa classe WMI parece estar quebrada de alguma forma. Felizmente, há uma solução alternativa, embora envolva um pouco mais de trabalho. Você precisará fazer o download do Windows Search 3 SDK . É apenas um ZIP de extração automática e você pode colocar os arquivos onde quiser. Estamos interessados apenas em um, Microsoft.Search.Interop.dll
na pasta Gerenciada. Carregue essa DLL no PowerShell:
Add-Type -Path "Microsoft.Search.Interop.dll"
Em seguida, você precisa de um objeto do gerenciador de pesquisa . Se você quiser pegar o da máquina local, é só isso:
$manager = New-Object Microsoft.Search.Interop.CSearchManagerClass
Se você quiser acessar uma máquina remota, é hora de um desvio.
Vamos precisar do GUID da classe COM, que eu extraí de algum cabeçalho C em algum lugar:
$guid = New-Object guid "{7D096C5F-AC08-4F1F-BEB7-5C22C517CE39}"
E vamos criar o tipo COM de tal forma que o Windows faça o RPC para nós:
$managerType = [Type]::GetTypeFromCLSID($guid, $targetMachine, $true)
Instancie o tipo:
$comManager = [Activator]::CreateInstance($managerType)
Transforme esse objeto COM novamente em um objeto .NET normal:
$manager = [System.Runtime.InteropServices.Marshal]::CreateWrapperOfType($comManager, [Microsoft.Search.Interop.CSearchManagerClass])
Desvio completo. Esse objeto agora se referirá ao gerenciador de pesquisa da máquina de destino.
Em seguida, obtenha o objeto de catálogo para o catálogo principal:
$cat = $manager.GetCatalog("SystemIndex")
A GetCatalogStatus
function informa se está sendo indexada no momento, mas essa função usa parâmetros "out", por isso precisamos passar referências:
$indexStatus = 0
$indexPauseReason = 0
$cat.GetCatalogStatus([ref]$indexStatus, [ref]$indexPauseReason)
Essas duas variáveis agora contêm um status vagamente legível se você forçá-las a serem strings. Atualmente, [string]$indexStatus
produz CATALOG_STATUS_PAUSED
para mim. Se o indexador estiver em pausa, essa segunda variável é a razão pela qual ele não está funcionando.
Obter o número de itens indexados é bastante fácil:
$cat.NumberOfItems()
O Windows é presumivelmente feito indexação quando não há mais coisas para indexar, então usaremos o NumberOfItemsToIndex
função, novamente com referências:
$incrementalCount = 0
$notificationQueue = 0
$highPriQueue = 0
$cat.NumberOfItemsToIndex([ref]$incrementalCount, [ref]$notificationQueue, [ref]$highPriQueue)
Se todas essas três variáveis forem zero, a indexação estará completa.
Todas essas funções fornecem os resultados esperados / corretos no Windows 8.1, enquanto o WMI faz para mim a mesma coisa que você fez para você.