1

Тема: VBA Изменение системной даты

Для запуска старой программы требуется установка нужной системной даты. Собственно разработчик который писал нам эту программу и забросил ее поддержку посоветовал нам этот способ.

Сейчас действия производятся такие:
1) Оператор включает компьютер.
2) Меняет системную дату на определенную
3) Запускает программу
4) Возвращает дату на текущую
5) Работает

Но тут включается человеческий фактор. Либо дата для запуска программы с ошибкой, либо текущая дата с ошибкой, либо забывают вернуть текущую дату.

Можно ли (в принципе) одним скриптом проделать эту цепочку действий? Я представляю как это должно выглядеть, но написать самостоятельно, к сожалению, такой скрипт не могу.

Алгоритм (в моем представлении):
1) Запомнить системную дату
2) Ззменить дату на нужную
3) Запустить exe файл
4) Подождать минуту (программа должна запустится и проверить дату)
5) Вернуть дату

Прошу помощи! И в любом случае - спасибо!

2

Re: VBA Изменение системной даты

golovindmitry, я правильно понимаю, что нет нужды ожидать завершения работы приложения, а достаточно подождать одну минуту? И почему выбрана категория VBA?!

Не проще ли Вам будет попробовать использовать сие: RunAsDate - Run a program with the specified date/time?!

3 (изменено: golovindmitry, 2020-11-21 23:22:25)

Re: VBA Изменение системной даты

alexii

Да, приложение проверяет дату при запуске (минуты хватает), а потом работает без проблем с любой датой, а другие приложения должны работать с нормальной системной датой - дата создания файлов, например, должна быть верной.

VBA - потому что, в моем представлении, это самый простой вариант, не требующий дополнительного ПО. Ну и простота использования - уж bat-файл или ярлык я сделать смогу.

По поводу RunAsDate - попробую, но сомнительно, что она поможет, т.к. наше приложение "при запуске проверяет системную дату" (слова человека который нам её писал), а RunAsDate - "Эта утилита не изменяет текущую системную дату и время вашего компьютера, а только вводит дату и время, которые вы укажете, в нужное приложение.". Отпишусь отдельно, как проверю.

4

Re: VBA Изменение системной даты

golovindmitry пишет:

т.к. наше приложение "при запуске проверяет системную дату" (слова человека который нам её писал), а RunAsDate - "Эта утилита не изменяет текущую системную дату и время вашего компьютера, а только вводит дату и время, которые вы укажете, в нужное приложение.".

Не так.

How does it work ?

RunAsDate intercepts the kernel API calls that returns the current date and time (GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime, NtQuerySystemTime, GetSystemTimePreciseAsFileTime), and replaces the current date/time with the date/time that you specify.

Вот «проверяет системную дату» — это как правило либо GetSystemTime(), либо GetLocalTime().

5 (изменено: Xameleon, 2020-11-24 15:22:39)

Re: VBA Изменение системной даты

Господа, не совсем понял почему эта задача планируется на VBA, если на VBS всё это можно сделать, вроде бы, проще.


Option Explicit

Dim datCurrentDate

'Проверка UAC
If Not IsElevated() Then
	CreateObject("Shell.Application").ShellExecute WSH.FullName, WSH.ScriptFullName,,"runas"
	WSH.Quit
End if

'Запоминаем дату
datCurrentDate = Now

'Сдвигаем дату на 1 день вперёд
SetDateTime(DateAdd("d",1,datCurrentDate))

MsgBox "Date added 1 day ! Now it's [" & Now & "]. Check the tray !"

'Возвращаем дату назад
SetDateTime datCurrentDate

MsgBox "We are back ! :)"

'Функция установки времени
Function SetDateTime([Date])
	With CreateObject("WbemScripting.SWbemDateTime")
		.SetVarDate [Date], True
		SetDateTime = CreateObject("WbemScripting.SWbemLocator").ConnectServer()_
		.Get("Win32_OperatingSystem=@").SetDateTime(.Value)
	End With
End Function

'Функция проверки наличия повышенных прав
Function IsElevated()
    IsElevated = CreateObject("WbemScripting.SWbemLocator").ConnectServer()_
	.Get("StdRegProv").CheckAccess(&H80000003,"S-1-5-19",&H1) = 0
End Function
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6

Re: VBA Изменение системной даты

Xameleon, для установки даты не нужна привилегия Systemtime?

7 (изменено: Xameleon, 2020-11-24 11:57:59)

Re: VBA Изменение системной даты

alexii, тоже об этом думал. Когда тестировался, выяснил, что мешает только UAC. Пока его не пройдёшь - хоть с привилегиями, хоть без них, доступа на изменение даты нет. Как только прошёл UAC, даже без привилегий спокойно дату меняет. Есть ощущение, что в этом случае привилегии играют роль только ограничительных мер после передачи объекта с полными правами в "чужие руки". Т.е когда у нас, как у базового процесса, получен доступ, но мы передаём объект другому процессу и не хотим ему давать полные права.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !