티스토리 뷰



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를 실행시키거나 "관리도구>작업 스케쥴러" 또는 "관리도구>예약 작업"으로 실행시킬 수 있습니다.

 

"작업 만들기..."를 선택합니다.

새 작업 만들기에서 중요한 부분이 이름과 함께 "가장 높은 수준의 권한으로 실행"을 선택하는 것입니다.

다음에는 상단의 "트리거" 탭을 선택하고 "새로 만들기"를 선택해서 새 트리거 만들기를 수행합니다. 새로운 트리거는 작업 시작 시점을 "시작할 때"로 설정합니다.

 

끝으로 "동작" 탭에서 새로 만들기로 수행할 프로그램을 선택하면 시스템이 시작하는 시점에 관리자 권한으로 프로그램을 실행시킬 수 있습니다.

 


댓글
댓글쓰기 폼