Diese WMI-Klasse scheint irgendwie gebrochen zu sein. Glücklicherweise gibt es eine Problemumgehung, die allerdings etwas mehr Arbeit erfordert. Sie müssen das Windows Search 3-SDK herunterladen . Es handelt sich lediglich um eine selbstentpackende ZIP-Datei, und Sie können die Dateien an beliebiger Stelle ablegen. Wir interessieren uns nur für einen Microsoft.Search.Interop.dll
Ordner im Ordner "Verwaltet". Laden Sie diese DLL in PowerShell:
Add-Type -Path "Microsoft.Search.Interop.dll"
Dann benötigen Sie ein Suchmanagerobjekt . Wenn Sie das für den lokalen Computer erhalten möchten, ist es einfach Folgendes:
$manager = New-Object Microsoft.Search.Interop.CSearchManagerClass
Wenn Sie auf einen Remote-Computer zugreifen möchten, ist es Zeit für einen Umweg.
Wir benötigen die GUID der COM-Klasse, die ich irgendwo aus einem C-Header extrahiert habe:
$guid = New-Object guid ""
Wir erstellen den COM-Typ so, dass Windows den RPC für uns erledigt:
$managerType = [Type]::GetTypeFromCLSID($guid, $targetMachine, $true)
Instanziere den Typ:
$comManager = [Activator]::CreateInstance($managerType)
Verwandeln Sie dieses COM-Objekt wieder in ein normales .NET-Objekt:
$manager = [System.Runtime.InteropServices.Marshal]::CreateWrapperOfType($comManager, [Microsoft.Search.Interop.CSearchManagerClass])
Umweg abgeschlossen. Dieses Objekt bezieht sich jetzt auf den Suchmanager der Zielmaschine.
Dann holen Sie sich das Katalogobjekt für den Hauptkatalog:
$cat = $manager.GetCatalog("SystemIndex")
Die GetCatalogStatus
Funktion sagt Ihnen, ob sie derzeit indiziert, aber diese Funktion verwendet "out" -Parameter. Daher müssen Sie Referenzen übergeben:
$indexStatus = 0 $indexPauseReason = 0 $cat.GetCatalogStatus([ref]$indexStatus, [ref]$indexPauseReason)
Diese beiden Variablen enthalten jetzt einen vage lesbaren Status, wenn Sie sie als Zeichenfolgen erzwingen. [string]$indexStatus
Derzeit produziert CATALOG_STATUS_PAUSED
für mich. Wenn der Indexer angehalten ist, ist diese zweite Variable der Grund, warum er keine Arbeit leistet.
Die Anzahl der indizierten Elemente zu ermitteln ist ziemlich einfach:
$cat.NumberOfItems()
Windows wird vermutlich indiziert, wenn keine weiteren Elemente mehr indiziert werden können. Daher verwenden wir die NumberOfItemsToIndex
Funktion erneut mit Verweisen:
$incrementalCount = 0 $notificationQueue = 0 $highPriQueue = 0 $cat.NumberOfItemsToIndex([ref]$incrementalCount, [ref]$notificationQueue, [ref]$highPriQueue)
Wenn alle drei Variablen Null sind, ist die Indizierung abgeschlossen.
Alle diese Funktionen liefern die erwarteten / korrekten Ergebnisse unter Windows 8.1, während WMI für mich das Gleiche tut wie für Sie.