Wie kann ich nützliche Informationen von den Leistungsindikatoren des Search Indexer erhalten?

560
Michał Masny

Ich habe versucht, einen Weg zu finden, um Informationen zum Indexierungsfortschritt programmgesteuert zu erhalten (wie viele Dateien noch benötigt werden oder "Indexierung abgeschlossen"). Ich stolperte über die Klasse Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer und war überrascht von der Anzahl der angezeigten Nullen, insbesondere der Null neben "IndexSize".

Wie kann ich nützliche Informationen von den Leistungsindikatoren des Search Indexer erhalten?

Indizierungsoptionen zeigen 5055 indizierte Elemente an, so dass meines Erachtens die Indexgröße ungleich Null sein sollte.

Wie kann ich nützliche Informationen von den Leistungsindikatoren des Search Indexer erhalten?

Welche Informationen repräsentieren diese Nullen? Sehe ich nicht die richtige Klasse an? Wenn ich bin, sollte ich etwas tun, um andere Nummern zu bekommen?

Dies ist unter Windows 8.1, aber die Computer, auf denen ich solche Dinge eigentlich machen möchte, sind Windows 7 und Windows 10.

Ich arbeite gerade von einem Windows 10-Computer, und es sieht ein bisschen anders aus. ActiveConnections zeigt hier 2 anstelle von 0. Ich habe auch festgestellt, dass auf beiden Computern einige der in FormattedData (Frequency_Sys100NS) fehlenden Eigenschaften in RawData angezeigt werden:

Rohdaten:

PS C:\WINDOWS\system32> gwmi Win32_PerfRawData_WSearchIdxPi_SearchIndexer   __GENUS : 2 __CLASS : Win32_PerfRawData_WSearchIdxPi_SearchIndexer __SUPERCLASS : Win32_PerfRawData __DYNASTY : CIM_StatisticalInformation __RELPATH : Win32_PerfRawData_WSearchIdxPi_SearchIndexer.Name="SystemIndex" __PROPERTY_COUNT : 72 __DERIVATION :  __SERVER : WRW-MXM0121 __NAMESPACE : root\cimv2 __PATH : \\WRW-MXM0121\root\cimv2:Win32_PerfRawData_WSearchIdxPi_SearchIndexer.Name="SystemIndex" ActiveConnections : 2 Caption :  CleanWidSets : 0 Description :  DirtyWidSets : 0 DocumentsFiltered : 0 Frequency_Object : 0 Frequency_PerfTime : 0 Frequency_Sys100NS : 10000000 IndexSize : 0 L0IndexesWordlists : 1 L0MergeFlushCount : 0 L0MergeFlushSpeedAverage : 0 L0MergeFlushSpeedLast : 0 L0MergesflushesNow : 0 L1MergeCount : 0 L1MergesNow : 0 L1MergeSpeedaverage : 0 L1MergeSpeedlast : 0 L2MergeCount : 0 L2MergesNow : 0 L2MergeSpeedaverage : 0 L2MergeSpeedlast : 0 L3MergeCount : 0 L3MergesNow : 0 L3MergeSpeedaverage : 0 L3MergeSpeedlast : 0 L4MergeCount : 0 L4MergesNow : 0 L4MergeSpeedaverage : 0 L4MergeSpeedlast : 0 L5MergeCount : 0 L5MergesNow : 0 L5MergeSpeedaverage : 0 L5MergeSpeedlast : 0 L6MergeCount : 0 L6MergesNow : 0 L6MergeSpeedaverage : 0 L6MergeSpeedlast : 0 L7MergeCount : 0 L7MergesNow : 0 L7MergeSpeedaverage : 0 L7MergeSpeedlast : 0 L8MergeCount : 0 L8MergesNow : 0 L8MergeSpeedaverage : 0 L8MergeSpeedlast : 0 MasterIndexLevel : 0 MasterMergeProgress : 0 MasterMergesNow : 0 MasterMergestoDate : 0 Name : SystemIndex PersistentIndexes : 4 PersistentIndexesL1 : 0 PersistentIndexesL2 : 0 PersistentIndexesL3 : 0 PersistentIndexesL4 : 0 PersistentIndexesL5 : 0 PersistentIndexesL6 : 0 PersistentIndexesL7 : 0 PersistentIndexesL8 : 0 Queries : 520 QueriesFailed : 1 QueriesSucceeded : 519 ShadowMergeLevels : 0 ShadowMergeLevelsThreshold : 0 Timestamp_Object : 0 Timestamp_PerfTime : 0 Timestamp_Sys100NS : 131122139817760000 UniqueKeys : 0 WorkItemsCreated : 0 WorkItemsDeleted : 0 PSComputerName : WRW-MXM0121 

FormatierteDaten:

PS C:\WINDOWS\system32> gwmi Win32_PerfRawData_WSearchIdxPi_SearchIndexer __GENUS : 2 __CLASS : Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer __SUPERCLASS : Win32_PerfFormattedData __DYNASTY : CIM_StatisticalInformation __RELPATH : Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer.Name="SystemIndex" __PROPERTY_COUNT : 72 __DERIVATION :  __SERVER : WRW-MXM0121 __NAMESPACE : root\cimv2 __PATH : \\WRW-MXM0121\root\cimv2:Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer.Name="SystemIn dex" ActiveConnections : 2 Caption :  CleanWidSets : 0 Description :  DirtyWidSets : 0 DocumentsFiltered : 0 Frequency_Object :  Frequency_PerfTime :  Frequency_Sys100NS :  IndexSize : 0 L0IndexesWordlists : 1 L0MergeFlushCount : 0 L0MergeFlushSpeedAverage : 0 L0MergeFlushSpeedLast : 0 L0MergesflushesNow : 0 L1MergeCount : 0 L1MergesNow : 0 L1MergeSpeedaverage : 0 L1MergeSpeedlast : 0 L2MergeCount : 0 L2MergesNow : 0 L2MergeSpeedaverage : 0 L2MergeSpeedlast : 0 L3MergeCount : 0 L3MergesNow : 0 L3MergeSpeedaverage : 0 L3MergeSpeedlast : 0 L4MergeCount : 0 L4MergesNow : 0 L4MergeSpeedaverage : 0 L4MergeSpeedlast : 0 L5MergeCount : 0 L5MergesNow : 0 L5MergeSpeedaverage : 0 L5MergeSpeedlast : 0 L6MergeCount : 0 L6MergesNow : 0 L6MergeSpeedaverage : 0 L6MergeSpeedlast : 0 L7MergeCount : 0 L7MergesNow : 0 L7MergeSpeedaverage : 0 L7MergeSpeedlast : 0 L8MergeCount : 0 L8MergesNow : 0 L8MergeSpeedaverage : 0 L8MergeSpeedlast : 0 MasterIndexLevel : 0 MasterMergeProgress : 0 MasterMergesNow : 0 MasterMergestoDate : 0 Name : SystemIndex PersistentIndexes : 4 PersistentIndexesL1 : 0 PersistentIndexesL2 : 0 PersistentIndexesL3 : 0 PersistentIndexesL4 : 0 PersistentIndexesL5 : 0 PersistentIndexesL6 : 0 PersistentIndexesL7 : 0 PersistentIndexesL8 : 0 Queries : 523 QueriesFailed : 1 QueriesSucceeded : 522 ShadowMergeLevels : 0 ShadowMergeLevelsThreshold : 0 Timestamp_Object :  Timestamp_PerfTime :  Timestamp_Sys100NS :  UniqueKeys : 0 WorkItemsCreated : 0 WorkItemsDeleted : 0 PSComputerName : WRW-MXM0121 

Und hier ist ein Beispiel, wie die Leistungsindikatoren für den Suchindex in mmc.exe aussehen (dies ist wieder auf dem Windows 10-Computer, auf dem Windows 8.1-Computer jedoch genauso). Es ist nur eine vertikale Linie, die sich über den Bildschirm bewegt. In diesem Fall ist der Zähler die Indexgröße.

Wie kann ich nützliche Informationen von den Leistungsindikatoren des Search Indexer erhalten?

Und ein Screenshot von Powershells Get-Counter in Aktion:

Wie kann ich nützliche Informationen von den Leistungsindikatoren des Search Indexer erhalten?

4

1 Antwort auf die Frage

2
Ben N

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.dllOrdner 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 GetCatalogStatusFunktion 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]$indexStatusDerzeit produziert CATALOG_STATUS_PAUSEDfü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 NumberOfItemsToIndexFunktion 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.

Danke für diese Antwort. Ich habe tatsächlich [eine separate Frage] (http://stackoverflow.com/questions/38193717/cant-query-systemindex-on-my-own-machine-when-i-specify-the-machine-name) dazu angestellt Paketüberfluss. Das Problem dabei ist, dass es anscheinend nicht möglich ist, eine Verbindung zu einem Remote-Katalog herzustellen. (+1 natürlich) Michał Masny vor 7 Jahren 0
Ah, ich wusste nicht, dass das eine Voraussetzung ist. Eine Möglichkeit wäre es, das gesamte Skript in ein [`Invoke-Command`] (https://technet.microsoft.com/en-us/library/dd347578.aspx) zu packen:` Invoke-Command -ComputerName Server1 server2 {} `. Alles, was Sie von diesem Skriptblock zurückgeben, wird auf dem lokalen Computer angezeigt. Leider muss die DLL auf einer Netzwerkfreigabe platziert oder anderweitig für alle Ziele verfügbar gemacht werden. Ben N vor 7 Jahren 0
Das ist eine gute Idee, danke. Ich habe das Programm aus der anderen Frage auch mit PsExec getestet und es funktioniert auch OK. Es wäre einfach schön, etwas zu haben, das kein Hack ist :) Wollen Sie damit sagen, dass es keine Möglichkeit gibt, diese DLL (oder eine andere) für die Verbindung zu einem Remote-Computer zu verwenden? Wenn ich wüsste, wie die GetCatalog-Methode implementiert wird, könnte ich sie vielleicht irgendwie erweitern, aber ich weiß auch nicht, wie ich das herausfinden kann, oder ich bin ein C ++ - Programmierer. Ich werde die andere Frage mit einer Prämie belohnen Du hast Lust zu antworten. Michał Masny vor 7 Jahren 0
@ymar Leider kann ich keine einzige Instanz im Internet finden, in der Benutzer diese Schnittstelle (entweder in C ++ oder .NET) erfolgreich für die Arbeit mit einem Remote-Computer verwendet haben. Ben N vor 7 Jahren 0
@ymar Ich habe meine Antwort mit einem Umweg für entfernte Maschinen aktualisiert. Es ist fast sicher, dass beide Computer Teil derselben Domäne sind und das Skript als Administrator ausgeführt wird. Es funktioniert für mich, wenn ich den Namen meines eigenen Computers als Ziel vorgebe, aber ich habe hier keine Domäne zum Testen. Ben N vor 7 Jahren 0