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

标签 c++ winapi performancecounter uptime

我正在尝试使用 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 天溢出时间长得多,如果可能的话,我宁愿没有单独的 PDH 版本用于 XP 和 GetTickCount64 版本用于 7...

最佳答案

因此 PdhCollectQueryData 的帮助表明,如果执行查询的进程缺少允许查询的适当提升 token ,则可以返回 PDH_NO_DATA。查看您是否可以准确检查进程本身已分配的用户权限,无论您是否以管理员身份登录。 Windows 7 对这个概念有很多粒度,尤其是在打开 UAC 的情况下。使用操作系统创建的本地管理员帐户与管理员组的成员在帐户最终获得的权限方面也存在区别,尽管我没有在性能计数器上遇到过特定的权限。

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

来自Microsoft help on the subject :

Only the administrator of the computer or users in the Performance Logs User Group can log and view counter data. Users in the Administrator group can log and view counter data only if the tool they use to log and view counter data is started from a Command Prompt window that is opened with Run as administrator.... Users in the Performance Monitoring Users group can view counter data.

关于c++ - 使用性能计数器获取正常运行时间的权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6353911/

相关文章:

c++ - 从 HDC 读取像素

c++ - DirectX 9 字体库?

c++ - 我如何在必须返回类模板的函数指针上使用 C++ 中的 typedef?

c# - 列出一个类别的所有性能计数器

c# - 为性能计数器分配一个浮点值

c# - 列出所有进程及其当前内存和 CPU 消耗?

c++ - 使用 2D vector 创建简单的扫雷应用程序

windows - WM_PAINT 和 DX12

windows - 使用 Win32 API 找出图标资源中的图标数量

windows - 如何通过扫描码(不是虚拟键码)获取键状态?