- ベストアンサー
VisualC++6.0でウィンドウズをシャットダウンするプログラム
環境VC++6.0 OS:ウィンドウズXP でウィンドウズをシャットダウンするプログラムを考えています。 現在 ExitWindowsEx(EWX_FORCE, NULL); と書いて実行しましたところ ログオフまでできました。 マニュアルなどには上記のコードは有無を言わさずウィンドウズをシャットダウンするものだと書かれてあったのですが、ログオフまでしかできませんでした。 どなたか、ウィンドウズをシャットダウンするプログラムを教えていただけないでしょうか? よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 ソースコードのサンプルです。 void Shutdown(void) { OSVERSIONINFO WinVersion; HANDLE hProc,hTkn; TOKEN_PRIVILEGES TokenP; WinVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&WinVersion); if (WinVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) { hProc = GetCurrentProcess(); if(OpenProcessToken(hProc,TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hTkn) != FALSE) { if(LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&TokenP.Privileges[0].Luid) != FALSE) { TokenP.PrivilegeCount = 1; TokenP.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hTkn,FALSE,&TokenP,0,NULL,0); } } } ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0); } かなり手抜きです。例えば、 ・特権が取れなかった場合もExitWindowsExを呼んでしまうので、シャットダウンせずログオフしてしまう。 ・Windows95/98/Meじゃないなら特権を取ろうとするのでwindows3.1でも特権を取ろうとしてしまう など。 うまく手抜きを修正して使用して下さい。
その他の回答 (2)
- chie65536
- ベストアンサー率41% (2512/6032)
#1です。 今、手元に具体的ソースコードが無いので、明日まで待って頂ければ具体的なソースコードを提示できます。
- chie65536
- ベストアンサー率41% (2512/6032)
WinNT/XP/2000では、シャットダウンには「シャットダウン特権」が必要です。また、Win95/98には特権は不要です。 ですので、GetVersionExで実行環境がWin95/98か調べ、Win95/98ならExitWindowExを呼ぶだけ、そうでない場合は呼ぶ前に特権を得なければなりません。 http://www.webcom-corp.co.jp/old/Win32FAQ/faq/q00023.htm
補足
早速のお返事ありがとうございます。 先ほどの特権が必要とのご指摘を受けましていろいろと試しております。 ソースコードを提示していただけるとほんと助かります。 不躾なお願いで申し訳ありませんがよろしくお願いいたします。