使用性能计数器获取正常运行时间的权限问题

Permission issue getting uptime with performance counters

本文关键字:运行时间 权限 问题 性能计数器 获取      更新时间:2023-10-16

我正在尝试使用C++中的性能计数器读取系统正常运行时间。我想至少支持XP和Windows7。

以下代码在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;

但它在Windows7上失败了。具体来说,无论我是否以管理员身份运行,PdhCollectQueryData都会返回PDH_NO_DATA。

如何在Windows7和XP上获得系统正常运行时间?我预计时间会比GetTickCount的49天溢出时间大得多,如果可能的话,我宁愿不为XP提供单独的PDH版本,也不为7提供GetTickCount64版本。。。

因此,PdhCollectQueryData的帮助表明,如果执行查询的进程缺少允许查询的适当提升令牌,则可以返回PDH_NO_DATA。查看是否可以检查进程本身分配了哪些用户权限,无论您是否以管理员身份登录。Windows7在这个概念上有很多粒度,尤其是在打开UAC的情况下;管理员组的成员,尽管我在性能计数器上没有遇到过特定的权限。

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

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

只有计算机管理员或性能日志用户组中的用户才能记录和查看计数器数据。"管理员"组中的用户只有在使用"以管理员身份运行…"打开的命令提示符窗口中启动了用于记录和查看计数器数据的工具时,才能记录和查看计数数据。。。。"性能监视用户"组中的用户可以查看计数器数据。