さて、基本的にPerfMonで取得したような、インストール済みのパフォーマンスカウンタカテゴリのリストを作成しようとしています。このために私はあなたがリストを検査し、一部が欠けていることを知るまでは、作品のように思えるPerformanceCounterCategory.GetCategoriesはPerfmonと矛盾しています
System.Diagnostics.PerformanceCounterCategory.GetCategories()
を使用しています。私が見つからなかった最初のものは、ReadyBoostキャッシュでした。これはプロジェクトが "x86"でコンパイルされているためです。これを「Any CPU」に変更すると、その問題が修正されました。
しかし、テストマシンの1つに「認可マネージャアプリケーション」カテゴリがあります(私はそうではなく、誰もなぜ、どこから来たのか分からないようです)。しかし、パフォーマンスカウンタカテゴリがPerfMonで表示されますが、C#からGetCategories()
メソッドを呼び出すときには表示されません。
誰でも知っていますか? PerformanceCounterCategories
を取得する信頼性の高い方法はありますか?これは私が.Netを使っているからですか?代わりに使用できるネイティブAPIがありますか?
EDIT
私は申し訳ありませんが、私はまだそれを得ることはありません。私はおそらくこれを説明するためにこのコードを書いた:
using System;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.Win32;
namespace PccHack
{
class Program
{
private static readonly Regex Numeric = new Regex(@"^\d+$");
static void Main(string[] args)
{
var pcc1 = PerformanceCounterCategory.GetCategories();
Console.Out.WriteLine("Getting automatically from the microsoft framework gave {0} results.", pcc1.Count());
string[] counters;
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"))
{
counters = regKey.GetValue("Counter") as string[];
}
var pcc2 = counters.Where(counter => !Numeric.IsMatch(counter)).ToList();
pcc2.Sort();
Console.Out.WriteLine("Getting manually from the registry gave {0} results.", pcc2.Count());
Console.In.ReadLine();
}
}
}
これは今私に3236の結果を与える。これは、システム内のすべてのパフォーマンスカウンタを取得するためです。だから私は、実際にパフォーマンスカウンタであるものを除外して、私にちょうどカテゴリを残しておくだけでよいことを理解しています。しかし、(これは一意ではないので)名前だけを取るPerformanceCounterのコンストラクタは存在せず、インデックス値を取るものもないようです。私はパフォーマンスデータヘルパーと呼ばれるWin32 APIを発見しましたが、これは私が望む機能を持っていないようです。そう。パフォーマンスカウンターインデックスがある場合、C#でそのインデックスのPerformanceCounterCategoryを取得するにはどうすればよいですか? PerfMonはそれを行うので、可能でなければなりません。インデックス "マジックナンバー"を解析して、どちらがどれであるか把握する方法はありますか?
EDIT 2
わかりました。 、私は.NET Frameworkを使用して138を取得し、私のマシンで
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Microsoft.Win32;
using System.Management.Automation;
namespace PccHack
{
internal class Program
{
private static void Main()
{
var counterMap = new Dictionary<string, string>();
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"))
{
var counter = regKey.GetValue("Counter") as string[];
for (var i = 0; i < counter.Count() - 1; i += 2)
{
counterMap.Add(counter[i], counter[i + 1]);
}
}
var pcc1 = PerformanceCounterCategory.GetCategories().Select(o => o.CategoryName).ToList();
var pcc2 = new List<string>();
// Get v1 providers
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\services"))
{
foreach (var subKeyName in regKey.GetSubKeyNames())
{
using (var subKey = regKey.OpenSubKey(subKeyName))
{
if (!subKey.GetSubKeyNames().Contains("Performance")) continue;
using (var perfKey = subKey.OpenSubKey("Performance"))
{
var blah = (string) perfKey.GetValue("Object List");
if (blah != null)
{
pcc2.AddRange(blah.Split(' ').Select(b => counterMap[b]));
}
}
}
}
}
// Get v2 providers
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\_V2Providers"))
{
foreach (var subKeyName in regKey.GetSubKeyNames())
{
using (var subKey = regKey.OpenSubKey(subKeyName))
{
foreach (var perfKeyName in subKey.GetSubKeyNames())
{
using (var perfKey = subKey.OpenSubKey(perfKeyName))
{
var blah = (string) perfKey.GetValue("NeutralName");
if (blah != null)
{
pcc2.Add(blah);
}
}
}
}
}
}
var ps = PowerShell.Create();
ps.AddCommand("Get-Counter").AddParameter("listSet", "*");
var pcc3 = ps.Invoke().Select(result => result.Members["CounterSetName"].Value.ToString()).ToList();
pcc1.Sort();
pcc2.Sort();
pcc3.Sort();
Console.Out.WriteLine("Getting automatically from the microsoft framework gave {0} results.", pcc1.Count());
Console.Out.WriteLine("Getting manually from the registry gave {0} results.", pcc2.Count());
Console.Out.WriteLine("Getting from PowerShell gave {0} results.", pcc3.Count());
Console.In.ReadLine();
}
}
}
117によって:。だから、これはで提案3つの異なるアプローチ(.NET /レジストリ/ PowerShellを)使用してコードの最新バージョンを私の頭をしていますレジストリの解析、157 PowerShell(これは正しい答えです)を使用します。
ただし、PowerShell/Windows SDKをインストールしたユーザーによっては、実際にはオプションではありません。
誰もが考えていますか?レジストリのどこかに隠されている、私が追跡する必要がある、極秘のバージョン3のパフォーマンスカウンタカテゴリがありますか?私は試しにアイデアがなくなっただけでなく、私も悪いアイデアを使い果たしてしまった。 perfmonで使用できる秘密のコマンドラインスイッチはありますか?すべてのカテゴリを一覧表示するには?
このPowerShellスニペットは、 'Get-Counter -listSet * | Select-Object -ExpandProperty Paths'(ソース:http://blogs.msdn.com/b/powershell/archive/2009/04/21/v2-quick-tip-monitoring-performance-counters-with-powershell.aspx) 。 –
ありがとうございます。しかし、私はプログラムでこれを行う必要があります。もっと重要なのは、PowerShellをインストールしているエンドユーザーに頼ることができないということです。私はPowerShellをインストールしていません。 :) –