@RedTea

Как реализовать изменение системного времени в Windows Service на C#?

Добрый день!

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

Имеется код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Runtime.InteropServices; 

namespace WindowsService1
{
    static class Program
    {
        [StructLayout(LayoutKind.Sequential)]

        private struct SYSTEMTIME                                                           //описываем переменную
        {
            public ushort wYear;
            public ushort wMonth;
            public ushort wDayOfWeek;
            public ushort wDay;
            public ushort wHour;
            public ushort wMinute;
            public ushort wSecond;
            public ushort wMilliseconds;
        }

        [DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)]
        private extern static void Win32GetSystemTime(ref SYSTEMTIME lpSystemTime);         //импортируем kernel32.dll и создаем переменную запроса времени из системы

        [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
        private extern static bool Win32SetSystemTime(ref SYSTEMTIME lpSystemTime);         //импортируем kernel32.dll и создаем переменную запроса на запись времени на систему


        private static System.Timers.Timer TimeCycle;                                       //создаем таймер
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
			{ 
				new TimeCycleService() 
			};
            ServiceBase.Run(ServicesToRun);

        }

private static void Cycle()
        {
            TimeCycle = new Timer();        //создаем таймер
            TimeCycle.Interval = 180000;    //время таймера 3 минуты
            TimeCycle.Enabled = true;       //включаем таймер
            TimeCycle.Elapsed += Time;      //по окончанию взываем событие
            TimeCycle.AutoReset = true;     //указываем авторестарт для таймера
        }

        private static void Time(Object source, ElapsedEventArgs e)
        {
            SYSTEMTIME time = new SYSTEMTIME();         //создаем переменную
            Win32GetSystemTime(ref time);               //получаем системное время
            time.wMinute = (ushort)(time.wMinute -3);   //от существующего времени отнимаем 3 минуты
            Win32SetSystemTime(ref time);               //записываем время в систему
        }
    }
}


При запуске сервера изменение времени не происходит, где-то я допустил ошибку или не учел особенности построения кода для сервиса. Почему именно - найти самостоятельно не смог, сервис запускается от имени LocalService и автостартом, никто не сможет подсказать где допущена ошибка?

Благодарю за ваше внимание!
  • Вопрос задан
  • 3265 просмотров
Пригласить эксперта
Ответы на вопрос 2
@asdz
а если из приложения менять, получается? Тут, почему то другие функции используются.
Ответ написан
Комментировать
@RedTea Автор вопроса
Нашел ошибку - не правильно оформил построение кода.
Сам код необходимо записывать в сервис форму с оформлением событий, запуска\остановки\перезапуска и тд.
У меня же был записан в код инициализирующий сервис.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы