Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261

Есть ли какой-то способ определить самую последнюю по времени создания, запись в реестр?

01.03.2020, 13:34. Показов 2356. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Понимаю, что в реестр пишется постоянно. Но мне не нужна точность до секунд и минут. Так-же понимаю, что у "добросовестных" юзеров, эта запись будет датирована текущим днем. Но есть такие "ребята", которые для запуска софта используют всякие манипуляции с датой и временем. Вот это и хочу проверить. То-есть если системное время будет меньше чем последнее обращение к реестру, то не давать софту запускаться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.03.2020, 13:34
Ответы с готовыми решениями:

Получить самую последнюю запись (по дате)
Здравствуйте. Подскажите, как получить из таблицы SomeSnapshot записи, которые были добавлены в таблицу за самую последнюю дату? ...

Нужно SQL-запросом вернуть самую последнюю добавленную запись
Нужно SQL-запросом вернуть самую последнюю добавленную запись. Такой вариант нормальный? SELECT `message`, `reply` FROM `chat` WHERE `id`...

Как вывести самую последнюю запись при реляции HasMany
в таблице Таскс хранятся Задачи, в таблице Таймс хранятся время их выполнения. Ранее для одной Задачи хранилось только одно время...

29
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
01.03.2020, 14:44
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Но есть такие "ребята", которые для запуска софта используют всякие манипуляции с датой и временем. Вот это и хочу проверить. То-есть если системное время будет меньше чем последнее обращение к реестру, то не давать софту запускаться.
От таких "ребят" это не спасёт.
Думайте о других способах защиты.
Если нужна серьёзная защиты, то придётся прибегнуть к сторонним продуктам.
Но от "серьёзных ребят" ни одна защита не поможет.
Только аппаратная, где в USB сервере содержится существенная часть Бизнес Логики.
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
01.03.2020, 14:50  [ТС]
Ну я же не об этом спрашивал. Про "ребят" написАл, чтобы было понятно, для чего мне это надо. А дальше я уже сам буду решать, что мне с этим делать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
01.03.2020, 15:15
Kuzya69, можно узнать последнее время любого изменения реестра (по данным файла), но не конкретного ключа.
Только если создать дополнительный ключ в не очевидной ветке для хранения этого времени.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
01.03.2020, 15:19
Kuzya69, может лучше обратиться к NTP серверу, сравнить его время с системным и в случае большого расхождения не запускать программу?
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
01.03.2020, 15:28  [ТС]
Элд Хасп, Не понял, а откуда-же тогда берется время создания , в программах работы с реестром? Например в "regedit", если экспортировать ветку с нужным ключем, в текстовый файл, то там конкретно дата и время указаны, типа:
"Последнее время записи: 21.03.2019 - 13:29". Мне не нужно время конкретного ключа, мне всего лишь нужно получить максимальную дату из всех значений дат реестра. Желательно без перечисления всех подряд веток реестра (или каким-нибудь быстрым перечислением веток).
OwenGlendower, это уже сделано, но может возникнуть вариант подмены ответа от сервера. Да и интернет может быть отключен. Вобщем лучше "перебдеть", чем "недобдеть"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
01.03.2020, 16:07
Kuzya69, Дата создания записи в реестре
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
01.03.2020, 16:17  [ТС]
Элд Хасп, Видел я это. Как получать дату для отдельного ключа, я знаю. Меня механизм перечисления веток реестра интересует, на максимальную дату, какой-нибудь продвинутый. Чтобы быстро работал. Или может есть какой-то способ получить максимальную дату без перечисления? Например: в реестре есть какой-то ключ, в котором как раз и лежит максимальная и минимальная дата изменений. Просто про реестр ну очень мало информации, и апи с ним работающих. У меня гугл вообще мало чего информативного про даты ключей дает.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
01.03.2020, 17:03
Kuzya69, скорее всего это будет время записи корневого раздела HKEY_CLASSES_ROOT
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
01.03.2020, 17:14  [ТС]
Элд Хасп, Нет. Последняя дата чаще всего фиксируется в HKEY_LOCAL_MACHINE, но если в ручную перевести дату, то там уже будет эта новая дата. На корневые каталоги ориентироваться нельзя. Нужно именно перечислять.
Даже не представляю как перечислить всю эту "файлово-реестровую" систему, сколько времени на это уйдет. Интуиция мне подсказывает, что должен быть более легкий способ, но ничего подходящего пока в МСДН не нахожу. Может есть что-то из недокументированного, но боюсь нет-код будет глючить на каких нибудь ОС, из-за недокуметированного.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
01.03.2020, 17:29
Kuzya69, насколько помню, при изменении ключа меняется раздел где он находится и в разделе фиксируется дата его изменения.
И вроде эта дата фиксируется по восходящей в родительских разделах.
Больше дат никаких в реестре нет.

Но очень давно с ним не работал. Может уже и забыл что-то.
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
01.03.2020, 17:39  [ТС]
Нет не по восходящей. Переводишь системную дату на любую нисходящую. Начинаешь систему юзать, и в конце концов дата фиксируется этим нисходящим значением. Вот сижу вычисляю конкретные ключи, которые оперативно реагируют на изменение даты, а которые "долго эту дату держат". Может хоть какие-то подветки выделю, чтобы не всю корневую ветку перечислять.

Добавлено через 5 минут
Пардон, кажется неправильно вас понял, но все равно. В ветках ключей реестра есть сегодняшняя дата, хотя я откатил системное время на вчерашнее. А корневая ветка HKEY_LOCAL_MACHINE у меня сейчас со вчерашней датой.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
01.03.2020, 17:43
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Нет не по восходящей. Переводишь системную дату на любую нисходящую. Начинаешь систему юзать, и в конце концов дата фиксируется этим нисходящим значением.
"Восходящей" - это по дереву разделов в реестре.
А дата не "нисходящую", а более ранняя.
Переставив системную дату назад и изменив реестр, то в изменённом разделе и по восходящей цепочке его родителей будет записана эта более ранняя дата.
Для "отлова" такого изменения вам надо пройтись по всему реестру на полную глубину дерева для определения имеется ли раздел у которого время изменения позже чем у корневого раздела. Чего при нормальной работе быть не может.

Это долго. Но можно сделать асинхронно.
То есть приложение откроется, начнёт работать, а через минуту закончится проверка и работа завершится.
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
01.03.2020, 17:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это долго. Но можно сделать асинхронно.
То есть приложение откроется, начнёт работать, а через минуту закончится проверка и работа завершится.
Да, я про это уже думал, но чтобы не показывать полную загрузку процессора во время запущенного приложения (открытой формы), что наведет на мысль проверить отчего это так. Я лучше во время запуска, перед открытием формы, выведу какую-нибудь заставку, пусть думают, что приложение еще грузится. А потом, после проверки открою форму. Но все равно, нужно будет поискать другой метод, слишком долгий это получится поиск с перечислением.
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
07.03.2020, 01:54  [ТС]
Хотелось бы продолжить беседу.
Вобщем запустил поиск максимальных дат. Работает пока отлично. Среднее время поиска по всему реестру, на разных ОС, от 1 до 2-х минут. Пришлось отказаться от сплеш-заставки. А то даже меня раздражало. Запускаю поиск в backgroundWorker-потоке.
Решил, для унификации алгоритма ввести и поиск минимальной даты, но тут оказалось, что в одной из моих ОС, есть дата 01.01.1601-3:00. Это немного вводит в заблуждение. Что это, глюк ОС, или битые кластеры жесткого диска?
Если это ОС, то наводит на мысль, что такие "заоблачные" даты могут появиться и в максимальных датах. А тогда придется вводить какую-то фильтрацию таких сумасшедших дат.
Ну и второй вопрос. Как можно снизить нагрузку на процессор backgroundWorker-потока? Пусть медленнее работает, для моих целей - не страшно. Зато не будет видно большой загрузки процессора (60-70%).
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
07.03.2020, 11:34
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Запускаю поиск в backgroundWorker-потоке.
Лучше используйте обычные таски в асинхронных методах.
backgroundWorker считается сейчас устаревшим средством.
И оставлен только для поддержки старых программ.

Добавлено через 3 минуты
Цитата Сообщение от Kuzya69 Посмотреть сообщение
в одной из моих ОС, есть дата 01.01.1601-3:00. Это немного вводит в заблуждение. Что это, глюк ОС, или битые кластеры жесткого диска?
Возможно это дата появилась при инициализации OC на новом компьютере с ещё не установленным системным временем.
Других причин в голову не приходит. Надо погуглить может есть и иные причины.

Добавлено через 2 минуты
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Ну и второй вопрос. Как можно снизить нагрузку на процессор backgroundWorker-потока? Пусть медленнее работает, для моих целей - не страшно. Зато не будет видно большой загрузки процессора (60-70%).
Не сталкивался с подобной задачей.
Можно попробовать в асинхронных методах периодически кидать в await Sleep с небольшим значением.

Добавлено через 9 минут
Цитата Сообщение от Kuzya69 Посмотреть сообщение
запустил поиск максимальных дат. Работает пока отлично. Среднее время поиска по всему реестру, на разных ОС, от 1 до 2-х минут.
Вам не нужна максимальная дата.
Вам нужно найти первую дату большую чем системное время.
Я думая в случае "кряка" она будет находится почти мгоновенно.
Но для нормального реестра, конечно, всё равно будет обход всего реестра.
Можно ограничить глубину обхода 1-2 ступенями.
Мало вероятно что при "кряке" будут вноситься столь существенные изменения.
Если же будут, то скорее всего их внесли и на всю глубину реестра.
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
07.03.2020, 13:16  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Лучше используйте обычные таски в асинхронных методах.
Чуть чуть попонятнее-поподробнее можно? Я действительно "начинающий". Хотя уже и возраст не малый, вот на "старость лет" увлекся. Сначала Делфи изучал, теперь на Cи переключился.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Возможно это дата появилась при инициализации OC на новом компьютере с ещё не установленным системным временем.
Да что-то я ни встречал таких ноутов у которых БИОС сбрасывается на 1601 год. Причем это не нулевой год, если смотреть на "DateTime.MinValume", что говорило-бы о стирании этой переменной в ноль, и не 1900 год, которым инициализируются такие переменные, а именно какая-то конкретная дата.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можно попробовать в асинхронных методах периодически кидать в await Sleep с небольшим значением.
Это-же придется делать внутри самого выполняющегося потока? А из-вне можно управлять таким потоком? Хотя тут я даже не уверен как я этим могу управлять (отправлять в sleep).
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вам не нужна максимальная дата.
Вам нужно найти первую дату большую чем системное время.
Тут я наверное соглашусь, но все равно нужно дать какую-то дельту, чтобы разница не на одну секунду превысила, а например на два-три дня.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можно ограничить глубину обхода 1-2 ступенями.
Мало вероятно что при "кряке" будут вноситься столь существенные изменения.
Ну тут я даже не уверен. Я думаю наилучшим методом будет разобраться, какие ветки реестра реагируют-меняются на работу в сети. В браузерах особо дату не "покрутишь", параметры безопасности не дадут открывать многие сайты. Да и не "кряк" это будет, со стороны "недобросовестного" пользователя. А обычная операция, по смене системного времени. И поэтому все ветки реестра, ближние к корню, в которых "происходил перевод в прошлое", будут иметь дату как раз "из прошлого". А мне нужны старенькие ветки, которые дальше от корня, в которых системное время, осталось "в настоящем". Поэтому я в своем поиске игнорирую ветки, у которых есть вложенные ключи, а смотрю дату только у самых дальних от корня ключей.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
07.03.2020, 14:06
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Я действительно "начинающий". Хотя уже и возраст не малый, вот на "старость лет" увлекся.
Я такой же.
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Сначала Делфи изучал, теперь на Cи переключился.
Используются очень разные приёмы программирования.
Переключиться будет не просто.
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Чуть чуть попонятнее-поподробнее можно?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        /// <summary>Обычный метод</summary>
        void Method() { }
 
        async void MethodAsync()
        {
            /// Делаем что в синхроном коде
            for (int i = 0; i < length; i++)
            {
                /// Како-то код
            }
 
            /// вызов синхроного Метода в ассинхронной задаче
            await Task.Factory.StartNew(Method);
 
            /// Делаем что в синхроном коде
            for (int i = 0; i < length; i++)
            {
                /// Како-то код
            }
 
 
            /// вызов синхроного Метода в ассинхронной задаче
            await Task.Factory.StartNew(Method);
 
 
            /// Делаем что в синхроном коде
            for (int i = 0; i < length; i++)
            {
                /// Како-то код
            }
 
 
        }
Добавлено через 9 минут
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Да что-то я ни встречал таких ноутов у которых БИОС сбрасывается на 1601 год. Причем это не нулевой год, если смотреть на "DateTime.MinValume", что говорило-бы о стирании этой переменной в ноль, и не 1900 год, которым инициализируются такие переменные, а именно какая-то конкретная дата.
Насколько знаю, это время ставит ОС при коррекции полей в регистре.
Почему в какой-то момент OC так посчитала - не знаю.
Надо проверить на разных компах.
Возможно такая дата есть в реестре на всех компах.

Добавлено через 2 минуты
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Это-же придется делать внутри самого выполняющегося потока? А из-вне можно управлять таким потоком? Хотя тут я даже не уверен как я этим могу управлять (отправлять в sleep).
Да, внутри.
Можно в цикле вставить проверку какого-то объекта переданного извне.
И изменяя во внешнем коде этот объект, можно будет отдавать какие-то команды в асинхронный метод.

Добавлено через 4 минуты
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Тут я наверное соглашусь, но все равно нужно дать какую-то дельту, чтобы разница не на одну секунду превысила, а например на два-три дня.
Да. 5-10 % от времени "лицензирования".

Добавлено через 6 минут
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Ну тут я даже не уверен. Я думаю наилучшим методом будет разобраться, какие ветки реестра реагируют-меняются на работу в сети.
А какая разница?
При изменении вложенной ветки время фиксируется по все восходящей цепочке.
И если было изменено системное время, а потом реестр, то это изменит время всех родительских узлов.
В других же ветках время останется прежнее.
Поэтому достаточно проверить верхний 1-2 уровня.
Расхождения уже на таком уровне должны выявиться.
Если, конечно, я правильно понимаю как работает реестр.
1
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
07.03.2020, 17:00  [ТС]
За код благодарю. Буду разбираться.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо проверить на разных компах.
Возможно такая дата есть в реестре на всех компах.
Да, похоже у всех есть такая "западлянка". На моих WinXP, Win7x64, есть такие ветки.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion\Perflib\009
Так вот они с такой старой датой.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
При изменении вложенной ветки время фиксируется по все восходящей цепочке.
И если было изменено системное время, а потом реестр, то это изменит время всех родительских узлов.
В других же ветках время останется прежнее.
Поэтому достаточно проверить верхний 1-2 уровня.
Как у меня происходит. У нас стояла сегодняшняя дата. Ветки родительских узлов датированы сегодняшней датой. Чтобы запустить мою программу, пользователь откатывает дату на "вчера". Через какое-то время, родительские ветки сменятся на вчерашние(по крайней мере у меня так). Но мне-то нужно отловить ветки "сегодняшние", а они куда дальше от родительских лежат, чем первые два-три уровня. И как-раз это ветки используемых в "сегодня" браузеров и программ, ну и еще кое-какие системные. Но я конечно не занимался выводом именно таких веток в лог. Может чуть позже сделаю. Сейчас надо с загрузкой процессора разобраться. Я, через regedit, экспортировал все родительские ветки реестра в текстовый файл, и искал в нем по дате.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
07.03.2020, 20:58
Цитата Сообщение от Kuzya69 Посмотреть сообщение
есть дата 01.01.1601-3:00
Это начало отсчета времени.
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Как можно снизить нагрузку на процессор
Экстрасенсы уже уволились, а мы без вашего кода не могем подсказать. Можно лишь посоветовать писать хороший код, купить мощный проц и т.д.. Код покажите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2020, 20:58
Помогаю со студенческими работами здесь

Как вывести самую последнюю запись при реляции HasMany
в таблице Таскс хранятся Задачи, в таблице Таймс хранятся время их выполнения. Ранее для одной Задачи хранилось только одно время...

Какой способ создания двумерного массива корректен
Какой способ создания двумерного массива размером 3×4, заполненного нулями, корректен? A = * 3 ] * 4 A = * 4 ] * 3 A = ] * 4 A = ...

Какой способ выбрать для создания GUI?
Здравствуйте. Необходимо создать проект с графическим интерфейсом. После поиска в интернете информации о возможных способах, передо мной...

Есть ли способ посмотреть историю создания таблиц?
Допустим в рамках бд были созданы разные таблицы в разное время. Есть ли возможность посмотреть . Какая таблица и как она называлась ,...

Какой самый простой способ создания отчета для распечатки datagridview
Здравствуйте все, подскажите как мне просто, не заморачиваясь, вывести на печать данные таблицы datagridviwer? Заранее благодарю


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru