再起動プログラム

yuki_endo2005-06-03

SoftEther上でリモートデスクトップを使っているんだけど、
調子がおかしくなることがあまりに多い。


リモートデスクトップが繋がらなくなるなると、ホストの再起動が必要になる。
仕方なくpcAnywhereを入れて再起動しようとしたけど、
リモートデスクトップが繋がらない状態だと、画面が真っ黒のまま固った。
VNCでも試したけど、症状は同じ。


ならば画面が見えなくても再起動するプログラムがあれば
解決するだろうと考え、Vectorで適当なものを探して、いくつか使ってみた。
エラーメッセージを表示しないなど、使いづらい部分があったので、
サンプルを探して実装してみた。
以下、覚え書き。


HANDLE token;
if (!::OpenProcessToken(
::GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
&token)) return FALSE;

LUID luid;
if (!::LookupPrivilegeValue(NULL, SE_REMOTE_SHUTDOWN_NAME, &luid)) return FALSE;

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!::AdjustTokenPrivileges(token, FALSE, &tp, 0, NULL, NULL)) return FALSE;
if (::GetLastError() != ERROR_SUCCESS) return FALSE;

if (!::InitiateSystemShutdown(comp, NULL, 30, TRUE, TRUE)) return FALSE;
return TRUE;