Имена экземпляров для системных счетчиков производительности локализованы?

Имена счетчиков производительности в Windows локализованы, например, счетчик \Processor(_Total)\% Processor Time что-то еще называется в других языковых версиях Windows. Это означает, что для того, чтобы найти правильное имя, нужно сначала найти индекс счетчика, а затем использовать функцию PdhLookupPerfNameByIndex, чтобы получить локализованное имя (использование PdhAddEnglishCounter отсутствует, если Windows XP должна поддерживаться).

Это все хорошо для объекта производительности (Processor) и счетчик (% Processor Time) части пути счетчика выше, но как насчет имени экземпляра (_Total)? Я не могу найти эту строку в реестре, поэтому я предполагаю, что она предоставляется любым системным компонентом, который предоставляет информацию.

Гарантируется ли одинаковое имя экземпляра для предоставленных системой счетчиков производительности в разных языковых версиях Windows?

Если нет, как я могу определить, какой экземпляр соответствует _Total пример?

2 ответа

Решение

Согласно этой поддержке KB, только объекты и счетчики имеют понятные имена:

Однако экземпляры не имеют удобного имени на каждом языке.

Таким образом, это приводит меня к мысли, что имена экземпляров для данного счетчика получаются либо динамически (например, ProcessId для процесса), либо статически (например, жестко запрограммированы). Конечно, ничто не мешает кому-то жестко запрограммировать "_Total" в английской сборке и что-то еще в немецкой сборке, хотя кажется, что обычной практикой является сохранение языкового материала в реестре и работа с объектами и счетчиками с помощью Индекс и экземпляры по динамическим или статическим именам. Я думаю, что Microsoft постоянно использует "_Total", как я видел это на нескольких инсталляциях на иностранных языках.

Люк прав. Чтобы получить локализованную версию Processor(_Total)\% Processor Time, мы должны получить локализованные имена каждого из компонентов пути "Processor" и "%Processor Time" с постоянным значением "(_Total)", Индексы могут варьироваться в зависимости от версии ОС, поэтому вы должны обнаруживать их при каждом запуске. Модуль win32pyutil содержит методы, которые будут загружать карту англо -индексного указателя, но сохраняют ее, и, поскольку она не маленькая, если она вам нужна только один раз, это может привести к потере памяти. Мы используем следующее:

def _find_pdh_counter_localized_name(eng_names,machine_name=None):
    '''
    Create a map of english names to indexes. We then lookup the english 
    name in the map to get the localized name.

    Shamefully lifted from win32pdhutil, only this one uses a transient map 
    instead of a persistent one.

    Will throw KeyError if a name is asked for that is not in the list.
    '''
    import win32api, win32con
    counter_reg_value = win32api.RegQueryValueEx(
        win32con.HKEY_PERFORMANCE_DATA, "Counter 009"
    )
    counter_list = counter_reg_value[0]
    eng_map={}
    for i in range(0, len(counter_list) - 1, 2):
        try:
            counter_id = int(counter_list[i])
        except ValueError:
            continue
        eng_map[counter_list[i+1].lower()] = counter_id
    ret = [] 

    for name in eng_names:
        ret.append(win32pdh.LookupPerfNameByIndex(
            machine_name, eng_map[name.lower()])
        )
    del eng_map
    return tuple(ret)

Чтобы построить имя счетчика:

    names = _find_pdh_counter_localized_name(['processor','% processor time'])
    counter_name = r'\%s(_Total)\%s' % names

который дает желаемое значение. например, "\Processore(_Total)\% Tempo Processore" на итальянском языке.

Другие вопросы по тегам