■ パソコンの時間を設定するアプリを作成する
GPSからの文字列を操作して時間を取得して、パソコンの時間を設定するアプリが簡単に作れるんじゃないかと思い作成することにしました。
まずは、時間を取得して設定する方法から。
Windows10だと、アプリ自体に管理者権限が無いとパソコンの時間の設定が出来ないようで、管理者権限で実行をする必要があります。
あと、パソコン自体の日付の自動調整を切っておく必要があります。
まずは、パソコンの日付をインクリメントするコード
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
SYSTEMTIME st;
//現在の協定世界時 UTC を取得します
GetSystemTime(&st);
printf("%d/%d/%d %d:%d:%d.%d\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
st.wDay++;
//時間の設定
SetSystemTime(&st);
GetSystemTime(&st);
printf("%d/%d/%d %d:%d:%d.%d\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
getchar();
return 0;
}
時間を取得して日付けに1を足して時間を設定、その後再取得して表示しています。
そのため、月末ではうまく動作しません。
協定世界時なので日本時間だと9時間足す必要があります。
▽ 管理者権限で実行したくない場合
SE_SYSTEMTIME_NAME特権をアプリに与えるとうまくいくらしいのですが私のWindows10ではダメでした。
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
HANDLE TokenHandle;
LUID Luid;
TOKEN_PRIVILEGES NewState;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&TokenHandle)){
return -1;
}
if(!LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &Luid)){
return -1;
}
NewState.PrivilegeCount = 1;
NewState.Privileges[0].Luid = Luid;
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle,FALSE,&NewState, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if(GetLastError() != ERROR_SUCCESS){
return -1;
}
SYSTEMTIME st;
//現在の協定世界時 UTC を取得します
GetSystemTime(&st);
printf("%d/%d/%d %d:%d:%d.%d\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
st.wDay++;
//時間の設定
SetSystemTime(&st);
GetSystemTime(&st);
printf("%d/%d/%d %d:%d:%d.%d\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
getchar();
return 0;
}
このコードでは特権が取得できず動作しませんでした。
そこで、ローカルセキュリティポリシーを変更する事で解決しました。
ローカルセキュリティポリシーを変更すると特権を取得も出来ましたが、そもそも特権自体が必要ないみたいです。
つまり、最初のコードでパソコンの時間をサクサク変更できました。