Решена Как узнать дату последней модификации параметра реестра

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,198
Реакции
5,991
Баллы
718
Есть ли такое в природе?
 

glax24

Разработчик
Сообщения
2,001
Реакции
1,491
Баллы
638
В природе есть, авторанс консольный выдает такую информацию.
 

Кирилл

Команда форума
Администратор
Сообщения
14,008
Реакции
6,397
Баллы
993
Системными средствами наверное никак,можно только отследить кеш измененных параметров и разделов-такие записи ведутся,как и запись всех действий производимых пользователем.
Насколько мне известно время и дата изменения так же кешируется,но уже в скрытом виде.

Так что либо спецсофт либо что то типа такого:

Есть функция на С++ (RegQueryInfoKey)

Код:
void QueryKey(HWND hDlg, HANDLE hKey)
{
    CHAR    achKey[MAX_PATH];
    CHAR    achClass[MAX_PATH] = "";  // буфер для имени класса
    DWORD    cchClassName = MAX_PATH;  // размер строки класса
    DWORD    cSubKeys;                // количество подключей
    DWORD    cbMaxSubKey;              // самый длинный подключ
    DWORD    cchMaxClass;              // самая длинная строка класса
    DWORD    cValues;              // кол-во значений для ключа
    DWORD    cchMaxValue;          // самое длинное имя
    DWORD    cbMaxValueData;      // самые длинные данные
    DWORD    cbSecurityDescriptor;
    FILETIME ftLastWriteTime;

    DWORD i, j;
    DWORD retCode, retValue;

    CHAR  achValue[MAX_VALUE_NAME];
    DWORD cchValue = MAX_VALUE_NAME;
    CHAR  achBuff[80];

    // Получаем имя класса и количество значений.
    RegQueryInfoKey(hKey,        // дескриптор ключа
        achClass,                // буфер для имени класса
        &cchClassName,          // размер строки класса
        NULL,                    // зарезервировано
        &cSubKeys,              // количество подключей
        &cbMaxSubKey,            // самый длинный подключ
        &cchMaxClass,            // самая длинная строка класса
        &cValues,                // кол-во значений для этого ключа
        &cchMaxValue,            // самое длинное имя
        &cbMaxValueData,        // самые длинные данные
        &cbSecurityDescriptor,
        &ftLastWriteTime);

    SetDlgItemText(hDlg, IDE_CLASS, achClass);
    SetDlgItemInt(hDlg, IDE_CVALUES, cValues, FALSE);

    SendMessage(GetDlgItem(hDlg, IDL_LISTBOX),
        LB_ADDSTRING, 0, (LONG) "..");

    // Перечисление дочерних ключей идёт до тех пор, пока RegEnumKeyEx не
    // выдаст ошибку. Затем получаем имя каждого ключа и копируем его
    // в список.

    SetCursor(LoadCursor(NULL, IDC_WAIT));
    for (i = 0, retCode = ERROR_SUCCESS;
            retCode == ERROR_SUCCESS; i++)
    {
        retCode = RegEnumKeyEx(hKey,
                    i,
                    achKey,
                    MAX_PATH,
                    NULL,
                    NULL,
                    NULL,
                    &ftLastWriteTime);
        if (retCode == (DWORD)ERROR_SUCCESS)
        {
            SendMessage(GetDlgItem(hDlg, IDL_LISTBOX),
                LB_ADDSTRING, 0, (LONG) achKey);
        }
    }
    SetCursor(LoadCursor (NULL, IDC_ARROW));

    // Получаем значения ключа.
    SetCursor(LoadCursor(NULL, IDC_WAIT));

    if (cValues)
    {
        for (j = 0, retValue = ERROR_SUCCESS;
                j < cValues; j++)
        {
            cchValue = MAX_VALUE_NAME;
            achValue[0] = '\0';
            retValue = RegEnumValue(hKey, j, achValue,
                &cchValue,
                NULL,
                NULL,    // &dwType,
                NULL,    // &bData,
                NULL);  // &bcData

            if (retValue == (DWORD) ERROR_SUCCESS )
            {
                achBuff[0] = '\0';

                // Добавляем каждое значение в список.
                if (!lstrlen(achValue))
                    lstrcpy(achValue, "<NO NAME>");
                wsprintf(achBuff, "%d) %s ", j, achValue);
                SendMessage(GetDlgItem(hDlg,IDL_LISTBOX2),
                    LB_ADDSTRING, 0, (LONG) achBuff);
            }
        }

    SetCursor(LoadCursor(NULL, IDC_ARROW));
}
Скопипастил отсюда:
http://devoid.com.ua/c-visualc-plus-plus/c-plus-plus-begginners/work-with-sub-keys-in-registry.html
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,198
Реакции
5,991
Баллы
718
Системными средствами наверное никак
На самом деле все делается очень просто:

Regedit => Файл => Экспорт => Формат *.txt :)

Раздел: HKEY_CURRENT_USER\Environment
Название класса: <Класс отсутствует>
Последнее время записи: 07.07.2014 - 2:22

Параметр 0
Название: TEMP
Тип: REG_SZ
Значение: C:\Users\Alex\AppData\Local\Temp

Параметр 1
Название: TMP
Тип: REG_EXPAND_SZ
Значение: %USERPROFILE%\AppData\Local\Temp

Параметр 2
Название: EMAIL_VIEWER
Тип: REG_SZ
Значение: C:\Program Files\Encryptomatic, LLC\PSTViewer Pro\PSTViewer.exe
Как узнать дату последней модификации параметра реестра
А вообще, ответ - нет. Нельзя. Т.к. метка времени пишется в ячейку подраздела, а не параметра.
Можно получить со 100% уверенностью только если внутри раздела всего 1 параметр,
иначе модификация любого другого параметра рядом не позволит однозначно идентифицировать время предудыщего.
Как только:
- создается / модифицируется (смена имени или значения) / удаляется параметр
- создается / удаляется подраздел
Метка времени раздела, в котором это происходит сменяется на дату/время последнего действия (с точностью до секунд).
Это не касается действий, которые происходят внутри подразделов этого раздела.
 
Последнее редактирование:

MyxaM

Новый пользователь
Сообщения
2
Реакции
0
Баллы
1
На powershell добрый человек написал скрипт get-registrykeylastwritetime , позволяющий читать даты в более автоматизированом режиме.
 
Сверху Снизу