0

C++ のパフォーマンス カウンターを使用して、システムの稼働時間を読み取ろうとしています。最低でも XP と Windows 7 の両方をサポートしたいと考えています。

次のコードは、Windows XP で正常に動作します...

HQUERY hQuery; HCOUNTER hCounter;
PDH_FMT_COUNTERVALUE Value;
int ret = 0;

if (PdhOpenQuery(NULL, 0, &hQuery) == ERROR_SUCCESS) {
  if ((status = PdhAddCounter(hQuery, queryURI, 0, &hCounter)) == ERROR_SUCCESS) {
    if ((status = PdhCollectQueryData(hQuery)) == ERROR_SUCCESS) {
      if ((status = PdhGetFormattedCounterValue(hCounter, PDH_FMT_LARGE, NULL, &Value)) == ERROR_SUCCESS) {
        ret = (DWORD)(Value.largeValue);
      }
    }
    PdhRemoveCounter(hCounter);
  }
  PdhCloseQuery(hQuery);
}
return ret;

..しかし、Windows 7 では失敗します。具体的には、管理者として実行しているかどうかに関係なく、 PdhCollectQueryData は PDH_NO_DATAを返します。

Windows 7 と XP の両方でシステムのアップタイムを取得するにはどうすればよいですか? この時間は、GetTickCount の 49 日間のオーバーフローよりもはるかに長くなると予想されます。可能であれば、XP 用の個別の PDH バージョンと 7 用の GetTickCount64 バージョンを用意したくありません...

4

1 に答える 1

1

したがって、PdhCollectQueryData のヘルプは、クエリを実行するプロセスにクエリを許可するための適切な昇格されたトークンがない場合に PDH_NO_DATA が返される可能性があることを示しています。管理者としてログインしているかどうかに関係なく、プロセス自体に割り当てられているユーザー権限を正確に確認できるかどうかを確認してください。Windows 7 では、特に UAC がオンになっている場合に、この概念に多くの粒度があります。OS で作成されたローカル管理者アカウントと管理者グループのメンバーとの間には、アカウントの最終的なアクセス許可に関して区別がある場合もありますが、パフォーマンス カウンターで特定のアカウントに遭遇したことはありません。

たとえば、プロセスで明示的な「管理者として実行」を試して、使用している管理者アカウントに実際にその権限があることを確認してください(あなたの質問から、すでにこれを試したかどうかはわかりません)。パフォーマンス ログ ユーザー グループのユーザー アカウントを試してください。OSインストール時に作成したアカウントをお試しください。UAC をオフにしてみてください。これらが問題の原因を突き止めるのに役立つことを願っています。

件名に関するMicrosoftのヘルプから:

コンピューターの管理者またはパフォーマンス ログ ユーザー グループのユーザーのみが、カウンター データをログに記録して表示できます。管理者グループのユーザーは、カウンター データのログと表示に使用するツールが、[管理者として実行...] で開かれたコマンド プロンプト ウィンドウから開始された場合にのみ、カウンター データのログと表示を行うことができます。パフォーマンス監視ユーザー グループのユーザーは、表示できます。カウンターデータ。

于 2011-06-15T11:03:34.003 に答える