首次调用Windows性能计数器(PDH)有时会失败

时间:2010-12-14 17:02:40

标签: c++ windows visual-studio performance

我遇到问题,有时候我的代码会正常运行,但有时会失败。

这是我运行的PDH相关代码的第一部分:

const std::wstring pidWildcardPath = L"\\Process(*)\\ID Process";
DWORD bufferSize = 0;
LPTSTR paths = NULL;

PDH_STATUS status = PdhExpandCounterPath(
    pidWildcardPath.c_str(),
    paths,
    &bufferSize);
checkPDHStatus(status, PDH_MORE_DATA, L"Expected request for more data.");

PdhExpandCounterPath函数调用的结果是0x800007D0PDH_CSTATUS_NO_MACHINE)。 checkPDHStatus函数是我写的一个简单函数,断言状态等于第二个参数。在这种情况下,我希望结果为PDH_MORE_DATA,因为pathsNULLbufferSize0。此调用的目标是确定我必须分配的缓冲区大小,以存储后续调用PdhExpandCounterPath的所有结果。这在备注部分下的PDH documentation中有所描述。

list of PDH error codesPDH_MORE_DATA描述为“无法连接到指定的计算机,或者计算机处于脱机状态。”正如您在上面代码中的性能计数器路径所看到的,我甚至没有尝试连接到与我自己不同的计算机。

这段代码失败的方式很有意思。有时它工作正常,然后其他时候,它将在我的应用程序的多次背对背执行失败。我的头文件中有#include <pdh.h>,我在这个DLL的属性表中有一个部分,如下所示:

<Tool
    Name="VCLinkerTool"
    AdditionalDependencies="pdh.lib"
/>

我不确定它是否重要,但此程序由Visual Studio 2005构建并在Windows XP上运行。我做错了吗?


我是戴夫的同事,在调查过程中发现了以下内容:

从登录的交互式会话运行时,上面的代码运行正常 当作为计划任务启动时,代码运行正常,并且用户在计划任务被启动时登录 代码FAILS仅在作为计划任务运行时且用户未在任务启动时登录 如果用户在失败任务启动后登录但仍在运行时代码继续失败(因为它“无休止地”循环,直到它返回PDH_MORE_DATA状态)。 在失败的实例中,尚未为程序建立/设置以下环境变量:APPDATA,HOMEDRIVE和HOMEPATH ......我不认为这是一个问题。但是,失败的程序也缺少来自其令牌的SeCreateGlobalPrivilege;传递的程序都在令牌中具有此权限,PERFMON将其显示为“默认启用”。另一个区别是失败的程序在令牌中具有NT_AUTH \ BATCH用户组,而传递的程序具有NT_AUTH \ INTERACTIVE而不是......所有其他用户组和特权对于两种情况都是相同的。我认为全局特权来自交互式登录,但不知道它是否与PDH操作有关。

我在Performance Counter / PDH文档中找不到任何有关此功能需要任何特殊权限或特权才能成功的内容。使用性能计数器需要全局权限吗?

或者,当该用户在任务启动时未登录时,在运行的计划任务(作为特定用户)之间存在一些其他上下文/环境差异,这将分别考虑PDH调用成功/失败?

1 个答案:

答案 0 :(得分:0)

请尝试使用此格式,表示本地计算机:

const std :: wstring pidWildcardPath = L“\\。\ Process(*)\ ID Process”;