我遇到問題,有時我的代碼會正常工作,但有時會失敗。第一次調用Windows性能計數器(PDH)有時會失敗
這是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函數調用的結果是0x800007D0
(PDH_CSTATUS_NO_MACHINE
)。函數checkPDHStatus
是我寫的一個簡單函數,它聲明狀態等於第二個參數。在這種情況下,我預計結果爲PDH_MORE_DATA,因爲paths
是NULL
而bufferSize
是0
。此調用的目標是確定我必須分配的緩衝區的大小,以存儲後續調用PdhExpandCounterPath
的所有結果。這在PDH documentation下描述的備註部分。
list of PDH error codes將PDH_MORE_DATA
描述爲「無法連接到指定的計算機,或者計算機處於脫機狀態」。正如你在上面的代碼中通過性能計數器路徑所看到的,我甚至不試圖連接到不同於我自己的計算機。
這段代碼失敗的方式很有趣。有時它可以正常工作,然後在其他時候,它會在我的應用程序的多次背靠背執行中失敗。我在我的頭文件#include <pdh.h>
和我在我的屬性表此DLL中的部分看起來像這樣:
<Tool
Name="VCLinkerTool"
AdditionalDependencies="pdh.lib"
/>
我不知道,如果它的問題,但這個程序是由Visual Studio 2005和建在Windows XP上運行。我做錯了什麼嗎?
我戴夫的同事,並已發現了我的調查過程中執行以下操作:
從開始時登錄的交互式會話 代碼運行正常運行時,上面的代碼運行正常作爲計劃任務並且用戶在計劃任務被觸發時登錄 代碼僅在作爲計劃任務運行時出現故障並且用戶在任務啓動時未登錄 如果代碼繼續發生故障用戶在失敗的任務已經啓動但仍在運行時登錄(因爲它正在「無休止地」循環,直到它獲得PDH_MORE_DATA統計信息我們回來)。 在失敗的實例中,下列環境變量尚未爲程序建立/設置:APPDATA,HOMEDRIVE和HOMEPATH ...我不認爲這是一個問題。但是,失敗的程序也缺乏來自其令牌的SeCreateGlobalPrivilege;傳遞的程序在令牌中都具有此特權,PERFMON將其顯示爲「Default Enabled」。另一個區別是失敗的程序在令牌中具有NT_AUTH \ BATCH用戶組,而傳遞程序具有NT_AUTH \ INTERACTIVE而不是所有其他用戶組和特權對於這兩種情況都是相同的。我認爲全球特權來自交互式登錄,但不知道它是否對PDH操作有任何影響。
在Performance Counter/PDH文檔中找不到任何有關需要任何特殊權限或特權才能使此功能成功的內容。是否需要使用性能計數器的全局特權?
或者當任務啓動時該用戶未登錄時,是否存在運行計劃任務(作爲特定用戶)的某些其他上下文/環境差異,這將導致PDH呼叫成功/失敗分別 ?
你可以試試這個「\\\\你的計算機名\\進程(*)\\ ID進程」,看看你是否有同樣的錯誤。還要檢查運行代碼的權限。 – 2010-12-14 17:24:56
@Simon Mourier:事實上它只是失敗了,有時會讓我相信這不是一個權限問題。我也不知道如何檢查代碼的權限。 – Dave 2010-12-14 17:48:00