2011-06-15 52 views
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版本(如果可能的话)...

回答

1

因此,对于PdhCollectQueryData的帮助指示如果执行查询的进程缺少适当的提升标记以允许查询,则可以返回PDH_NO_DATA。无论您是否以管理员身份登录,看看您是否可以确切地检查已分配进程本身的用户权限。 Windows 7对这个概念有很多细化,特别是在UAC打开的情况下。根据帐户的最终权限,管理员组的成员使用OS &创建的本地管理员帐户之间也可以有区别,尽管我没有在性能计数器上遇到特定的权限。

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

Microsoft help on the subject

在性能上的计算机或用户只有管理员登录用户组可以登录并查看计数器数据。管理员组中的用户只有在他们用来记录和查看计数器数据的工具是从以管理员身份运行打开的命令提示符窗口启动时,才可以记录和查看计数器数据.... Performance Monitoring Users组中的用户可以查看计数器数据。

+0

这有可能是问题,但我仍然不能似乎解决它.. 我说我的用户性能日志用户组,禁用UAC,我仍然得到错误无论我正常运行二进制文件,以管理员身份或从提升的命令提示符运行。 – mappu 2011-06-16 11:02:37

+0

对此回复迟到抱歉,但我最近遇到了可能有所帮助的事情。您可能需要明确请求您的流程权限。有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa446619.aspx。您打开一个具有调整权限的进程令牌(OpenProcessToken),然后使用调用AdjustTokenPrivileges的代码调整令牌的权限。我必须这样做才能拥有一个以管理员权限运行的进程,以调整当前的系统时区。 – naviwhack 2011-10-28 15:59:36