一体なにに使うんだ、そんな怖いcgiという感じですが、ブラウザでアクセスするとWindowsを再起動するCGIを作りました。
背景を簡単に説明。
今日どうしても出先から自宅のWindows2000 Serverの設定をいじりたかったのです。
しかしターミナルサービスへのログインを家でしたままで、ネットワークログオン数がライセンス数一杯になってしまいました。
本当に急いでいたので已む無くFTPで再起動コマンドをputしてhttp経由で実行しようと思ったわけです。前もやった気が・・。
Content-Typeさえ出力すればいいわけですが、これが無いとエラーになってしまうので必須です。
WindowsXPのシャットダウンコマンドを使うのはそれが故にダメかもしれない。
が、サーバエラーになっても実行自体はされてるのでOKなのかも。
生憎Windows2000だったので簡単にプログラミングしました。
Windows2000/XPでのコンピュータの再起動方法は以下のような感じです。
1 : #include <windows.h>
2 : #include <stdio.h>
3 :
4 : int main()
5 : {
6 : HANDLE hToken;
7 : TOKEN_PRIVILEGES tp;
8 :
9 : //Content-Typeを出力
10 : printf("Content-type: text/html\n\n");
11 :
12 : //プロセスのトークンを開く
13 : if (!OpenProcessToken(GetCurrentProcess(),
14 : TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){
15 : printf("Error on OpenProcessToken() %d\n",GetLastError());
16 : }
17 :
18 : //SE_SHUTDOWN_NAMEのLUID取得
19 : LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
20 : &tp.Privileges[0].Luid);
21 :
22 : tp.PrivilegeCount = 1;
23 : tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
24 :
25 : //シャットダウン特権を取得する
26 : if(!AdjustTokenPrivileges(hToken, FALSE, &tp, 0,
27 : (PTOKEN_PRIVILEGES)NULL, 0)){
28 : printf("Error on AdjustTokenPrivileges() %d\n",GetLastError());
29 : }
30 :
31 : //シャットダウン/リブート
32 : if(!ExitWindowsEx(EWX_REBOOT|EWX_SHUTDOWN|EWX_FORCE,NULL)){
33 : printf("Error on ExitWindowsEx() %d\n",GetLastError());
34 : }
35 :
36 : printf("Reboot.\n");
37 : return 0;
38 : }