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 的情况下。使用操作系统创建的本地管理员帐户和管理员组的成员在帐户最终获得的权限方面也可能存在区别,尽管我在性能计数器上没有遇到特定的权限。

例如,在该过程中尝试明确的“以管理员身份运行”,并确保您使用的管理员帐户确实具有该权限(我不确定您是否已经尝试过此操作)。尝试性能日志用户组中的用户帐户。尝试安装操作系统时创建的帐户。尝试关闭 UAC。这些有望帮助确定问题的根源。

来自微软关于该主题的帮助

只有计算机管理员或性能日志用户组中的用户才能记录和查看计数器数据。只有当他们用于记录和查看计数器数据的工具是从以管理员身份运行...打开的命令提示符窗口启动时,管理员组中的用户才能记录和查看计数器数据。性能监控用户组中的用户可以查看计数器数据。

于 2011-06-15T11:03:34.003 回答