Установка времени программно в Windows 7 - PullRequest
7 голосов
/ 19 октября 2010

Я портирую приложение из Windows 2000 (не спрашиваю) в Windows 7, и мне нужно повторить функциональность, которая позволяет пользователю устанавливать время из графического интерфейса. Ранее это было сделано с помощью вызова «time» напрямую из командной строки, но, похоже, пользовательские разрешения несколько изменились в Windows 7.

Проведя некоторые исследования, кажется, что вы можете установить время, используя вызов kernel32.dll метода Win32SetSystemTime, но возникает та же проблема с разрешениями. Чтение MSDN Я думаю, мне нужно включить SE_SYSTEMTIME_NAME, однако, что бы я ни пытался, я не могу заставить это работать.

Есть ли у кого-нибудь проверенный пример кода для Windows 7, позволяющий API-вызову Win32SetSystemTime?

Ответы [ 3 ]

7 голосов
/ 19 октября 2010

Не уверен, почему это не работает для вас.Следующий код устанавливает время для сегодняшней даты в 16:12 UTC.(Работает для меня)

public class Program 
{
    public struct SystemTime
    {
        public ushort Year;
        public ushort Month;
        public ushort DayOfWeek;
        public ushort Day;
        public ushort Hour;
        public ushort Minute;
        public ushort Second;
        public ushort Millisecond;
    };

    [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
    public extern static bool Win32SetSystemTime(ref SystemTime st);

    public static void Main(string[] args)
    {
        SystemTime st = new SystemTime
        {
            Year = 2010, Month = 10, Day = 18, Hour = 16, Minute = 12, DayOfWeek = 1
        };
    }
}

Согласно документам :

Вызывающий процесс должен иметь привилегию SE_SYSTEMTIME_NAME.Эта привилегия по умолчанию отключена.Функция SetSystemTime включает привилегию SE_SYSTEMTIME_NAME перед изменением системного времени и отключает привилегию перед возвратом.Для получения дополнительной информации см. Запуск со специальными привилегиями.

Похоже, что это не должно быть проблемой.

6 голосов
/ 19 октября 2010

Ну, если худшее приходит к худшему, всегда есть

System.Diagnostics.Process.Start("CMD", "/C TIME 19:58");  // set time to 7:58PM
4 голосов
/ 19 октября 2010

Ваше приложение необходимо повысить, чтобы изменить время (поскольку изменение времени может привести к тому, что журналы активности и т. Д. Будут неверными), но не для изменения часового пояса.Поместите манифест в ваше приложение с requireAdministrator, и приложение поднимет.(Чтобы проверить это перед созданием манифеста, щелкните правой кнопкой мыши на вашем exe-файле и запустите от имени администратора. Это повысит уровень приложения только один раз. Повышение уровня отличается от запуска того, кто входит в группу администраторов.выбрав использовать свои полномочия.)

Скорее всего, пользователю не понравится приглашение UAC, поэтому, если время меняется редко, разделите его на отдельный исполняемый файл и вставьтеманифест в главном приложении с asInvoker и другим на устройстве изменения времени с requireAdministrator, и запустите устройство изменения времени из основного приложения с ShellExecute.Идеально иметь кнопку или пункт меню, чтобы это произошло, и наложить на него значок щита, чтобы приглашение UAC не удивляло пользователя.Я отклоняю запросы UAC, которых я не ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...