Проблема с разрешением при получении с помощью счетчиков производительности - PullRequest
0 голосов
/ 15 июня 2011

Я пытаюсь прочитать время работы системы, используя счетчики производительности в 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?Я ожидаю, что время будет намного больше, чем 49-дневное переполнение GetTickCount, и я бы предпочел не иметь отдельных версий PDH для XP и версий GetTickCount64 для 7, если это вообще возможно ...

1 Ответ

1 голос
/ 15 июня 2011

Таким образом, справка для PdhCollectQueryData указывает, что PDH_NO_DATA может быть возвращено, если процессу, выполняющему запрос, не хватает соответствующего повышенного токена, чтобы разрешить запрос. Посмотрите, можете ли вы точно проверить, какие пользовательские полномочия были назначены самому процессу, независимо от того, вошли вы в систему как администратор или нет. В Windows 7 есть большая степень детализации этой концепции, особенно с включенным UAC. Также может быть различие между локальной учетной записью «Администратор», созданной в ОС, и членом группы «Администраторы» с точки зрения того, с какими разрешениями заканчивается эта учетная запись, хотя я не обнаружил какой-либо конкретной учетной записи для счетчиков производительности.

Попробуйте, например, явное «Запуск от имени администратора» и убедитесь, что у используемой учетной записи администратора действительно есть такое разрешение (я не уверен по вашему вопросу, пробовали ли вы это уже или нет) , Попробуйте использовать учетную запись пользователя в группе «Журналы производительности». Попробуйте учетную запись, которая была создана при установке ОС. Попробуйте с выключенным UAC. Надеемся, что это поможет выявить источник проблемы.

Из справки Microsoft по теме :

Только администратор компьютера или пользователи в группе пользователей Performance Logs могут регистрировать и просматривать данные счетчика. Пользователи в группе администраторов могут регистрировать и просматривать данные счетчиков только в том случае, если инструмент, который они используют для регистрации и просмотра данных счетчиков, запускается из окна командной строки, которое открывается с помощью команды Запуск от имени администратора .... Пользователи в группе Пользователи Performance Monitoring могут просматривать данные счетчика.

...