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

Тема в разделе "Реестр Microsoft Windows", создана пользователем Dragokas, 18 дек 2013.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Есть ли такое в природе?
     
  2. glax24
    Оффлайн

    glax24 Разработчик

    Сообщения:
    2.000
    Симпатии:
    1.450
    В природе есть, авторанс консольный выдает такую информацию.
     
    Kиpилл и shestale нравится это.
  3. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.232
    Симпатии:
    4.980
    Системными средствами наверное никак,можно только отследить кеш измененных параметров и разделов-такие записи ведутся,как и запись всех действий производимых пользователем.
    Насколько мне известно время и дата изменения так же кешируется,но уже в скрытом виде.

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

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

    Код (Text):
    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
     
    Последнее редактирование: 19 дек 2013
    Dragokas нравится это.
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    На самом деле все делается очень просто:

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

    --- Объединённое сообщение, 22 июл 2014, Дата первоначального сообщения: 22 июл 2014 ---
    А вообще, ответ - нет. Нельзя. Т.к. метка времени пишется в ячейку подраздела, а не параметра.
    Можно получить со 100% уверенностью только если внутри раздела всего 1 параметр,
    иначе модификация любого другого параметра рядом не позволит однозначно идентифицировать время предудыщего.
    Как только:
    - создается / модифицируется (смена имени или значения) / удаляется параметр
    - создается / удаляется подраздел
    Метка времени раздела, в котором это происходит сменяется на дату/время последнего действия (с точностью до секунд).
    Это не касается действий, которые происходят внутри подразделов этого раздела.
     
    Последнее редактирование: 22 июл 2014
    fseto, Phoenix, Kиpилл и ещё 1-му нравится это.

Поделиться этой страницей