C#에서 시스템 시간 설정하기, 관리자 권한으로 시작프로그램 등록하기
C# 닷넷 프로그램에서 시스템 시간을 변경하는 과정을 설명합니다.
C# 닷넷 프로그램에서 시스템 시간을 설정하는 과정에서 꼭 유념해야 할 것들은 WIN32 API인 SetSystemTime()을 이용해서 설정하는데 그 과정에서 컴퓨터 시스템의 타임존을 반드시 감안해야 한다는 것입니다. 또한 윈도우 10등의 경우 시스템 시간을 변경하는 것이므로 프로그램을 관리자 권한으로 수행시켜야 프로그램이 실제 효력을 발휘할 수 있습니다.
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")]
public extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime);
......
SYSTEMTIME st = new SYSTEMTIME();
DateTime tmpdate = new DateTime(st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);
tmpdate = tmpdate.AddHours(-9); //KOR timezone adjust
st.wDayOfWeek = (ushort)tmpdate.DayOfWeek;
st.wMonth = (ushort)tmpdate.Month;
st.wDay = (ushort)tmpdate.Day;
st.wHour = (ushort)tmpdate.Hour;
st.wMinute = (ushort)tmpdate.Minute;
st.wSecond = (ushort)tmpdate.Second;
st.wMilliseconds = 0;
SetSystemTime(ref st);
C# 닷넷 응용 프로그램에서 WIN32 API를 사용하려면 우선 "using System.Runtime.InteropServices;"를 참조로 추가 해야합니다. 시스템 시간 변경을 수행하는 API인 SetSystemTime()의 프로토타입을 위의 예제처럼 작성해 주면 되는데 연관 시스템 파일은 kernel32.dll 입니다.
위의 예제에서는 설정할 년, 월, 일, 시, 분, 초 데이터를 일단 DateTime에 담았다가 SetSystemTime()이 수용하는 SYSTEMTIME 구조체로 옮겨서 호출하는데 중간에 AddHours(-9)를 호출해서 한국 시간으로 보정하는 과정을 담았습니다. 이 작업을 누락하면 GMT+0로 설정될 수 있습니다. 이 부분은 시스템마다 다르게 동작할 수 있으므로 꼭 확인해야 합니다. 한국은 KST GMT+9입니다.
프로그램을 빌드하고 수행시키면 윈도우 10의 경우에는 정상 동작하지 않을 수 있습니다. 이 경우 빌드한 프로그램을 "관리자 권한으로 수행" 시키면 정상 동작할 것입니다.
또 한 가지, 예외적인 상황이 발생할 수 있는데, 이렇게 만든 프로그램을 시스템 부팅 과정에서 자동 실행하도록 설정할 경우입니다. 이 작업은 프로그램을 단순히 시작 프로그램에 등록하는 것으로 제대로 동작하지 않습니다. 이런 경우에는 윈도우 작업 스케쥴러에 등록하는 것으로 해결할 수 있습니다.
작업 스케쥴러 등록은 윈도우+R로 실행창을 띄워 taskschd.msc를 실행시키거나 "관리도구>작업 스케쥴러" 또는 "관리도구>예약 작업"으로 실행시킬 수 있습니다.
"작업 만들기..."를 선택합니다.
새 작업 만들기에서 중요한 부분이 이름과 함께 "가장 높은 수준의 권한으로 실행"을 선택하는 것입니다.
다음에는 상단의 "트리거" 탭을 선택하고 "새로 만들기"를 선택해서 새 트리거 만들기를 수행합니다. 새로운 트리거는 작업 시작 시점을 "시작할 때"로 설정합니다.
끝으로 "동작" 탭에서 새로 만들기로 수행할 프로그램을 선택하면 시스템이 시작하는 시점에 관리자 권한으로 프로그램을 실행시킬 수 있습니다.