使用性能计数器获取正常运行时间的权限问题
Permission issue getting uptime with performance counters
我正在尝试使用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。这些有望帮助确定问题的根源。
来自微软关于主题的帮助:
只有计算机管理员或性能日志用户组中的用户才能记录和查看计数器数据。"管理员"组中的用户只有在使用"以管理员身份运行…"打开的命令提示符窗口中启动了用于记录和查看计数器数据的工具时,才能记录和查看计数数据。。。。"性能监视用户"组中的用户可以查看计数器数据。
相关文章:
- KMP算法和LPS表构造的运行时间
- AWS Lambda C++运行时权限被拒绝
- 如何计算Big-O表示法中的平均渐近运行时间
- 用时钟测量程序的运行时间
- 如何减少代码的运行时间以对齐文本?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 使用 Qt 测量过程的实际运行时间
- 如何执行用 C++ 编写的程序的运行时间?
- 无限运行时间
- 如何优化C++键值程序以获得更快的运行时间
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 重复值的最长运行时间
- 同一程序的运行时间差异很大,有时达到1000+us
- 测量 OpenCL 应用程序的运行时间
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- C 获得运行时间和内存使用量
- 使用性能计数器获取正常运行时间的权限问题