2011-06-15 3 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; 

는 윈도우 7에 실패 ..하지만 특히,에 관계없이 내가 관리자로 실행 여부 PdhCollectQueryData 반환 PDH_NO_DATA.

어떻게 Windows 7과 XP에서 시스템 가동 시간을 얻을 수 있습니까? 나는이 시간이 GetTickCount의 49 일 오버플로보다 훨씬 클 것으로 기대하며, 가능하다면 XP 용으로 별도의 PDH 버전과 7 용 GetTickCount64 버전을 사용하지 않을 것입니다.

답변

1

따라서 PdhCollectQueryData에 대한 도움말은 질의를 수행하는 프로세스가 질의를 허용하는 적절한 상승 토큰을 가지고 있지 않으면 PDH_NO_DATA가 리턴 될 수있다. 관리자로 로그인했는지 여부에 관계없이 프로세스 자체가 할당 된 사용자 권한을 정확히 확인할 수 있는지 확인하십시오. Windows 7은 특히 UAC를 켠 상태에서이 개념에 대해 세분화되어 있습니다. OS &으로 만든 로컬 관리자 계정과 성능 카운터에서 특정 계정을 발견하지 못했지만 계정이 끝나는 사용 권한 측면에서 Administrators 그룹의 구성원간에 차이점이있을 수 있습니다.

예를 들어 프로세스에서 명시 적으로 '관리자 권한으로 실행'을 시도하고 사용중인 관리자 계정에 해당 권한이 있는지 확인하십시오 (이미 시도했는지 여부는 모르겠습니다.)). 성능 로그 사용자 그룹에서 사용자 계정을 사용해보십시오. OS를 설치할 때 생성 된 계정을 사용해보십시오. UAC를 꺼보십시오. 이들은 희망적으로 문제의 근원을 밝혀내는 데 도움이 될 것입니다. Microsoft help on the subject에서

:

성능의 컴퓨터 또는 사용자의 관리자 만이 사용자 그룹은 로그보기 카운터 데이터 수 기록합니다. 관리자 그룹의 사용자는 관리자 권한으로 실행으로 열리는 명령 프롬프트 창에서 카운터 데이터를 기록하고 보는 데 사용하는 도구가 시작된 경우에만 카운터 데이터를 기록하고 볼 수 있습니다. 성능 모니터링 사용자 그룹의 사용자는 카운터 데이터.

+0

이이 문제가 될 수있다,하지만 난 여전히 그것을 해결하기 위해 수없는 것 .. 나는 성능 로그 사용자 그룹, 장애인 UAC에 내 사용자를 추가하고, 난 여전히 여부에 관계없이의 오류가 난 바이너리를 정상적으로 실행하거나 관리자 또는 상승 된 명령 프롬프트에서 실행하십시오. – mappu

+0

이 회신의 지각에 대한 사과,하지만 최근에는 도움이 될만한 것을 발견했습니다. 아마도 프로세스에 대한 권한을 명시 적으로 요청해야합니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/aa446619.aspx를 참조하십시오. 조정 권한이있는 프로세스 토큰 (OpenProcessToken)을 연 다음 AdjustTokenPrivileges를 호출하는 해당 코드를 사용하여 토큰의 권한을 조정합니다. 다른 방법으로 현재 시스템 시간대를 조정하기 위해 관리자 권한으로 실행중인 프로세스를 갖기 위해이 작업을 수행해야했습니다. – naviwhack

관련 문제