- PR -

VB.NETでOSをシャットダウンするには?

1
投稿者投稿内容
べっかめ
会議室デビュー日: 2004/06/05
投稿数: 7
お住まい・勤務地: 大分県
投稿日時: 2004-06-05 00:32
初めまして 初書き込みです。

VB.NETでWindowsOSをシャットダウンするには
どうすればよいのでしょうか?

誰か教えてください。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-06-05 08:41
引用:

VB.NETでWindowsOSをシャットダウンするには
どうすればよいのでしょうか?



・System.Management 配下のクラスを使って WMI を介してシャットダウンする。
・COM 連携で Shell.Application オブジェクトの ShutdownWindows() メソッドを呼び出す。
・P/INVOKE で ExitWindowsEx() を呼び出す。

のどれでも出来たと思います。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
べっかめ
会議室デビュー日: 2004/06/05
投稿数: 7
お住まい・勤務地: 大分県
投稿日時: 2004-06-05 10:14
ありがとうございます。
早速やってみます。
べっかめ
会議室デビュー日: 2004/06/05
投稿数: 7
お住まい・勤務地: 大分県
投稿日時: 2004-06-05 11:21
COM 連携で Shell.Application オブジェクトの ShutdownWindows() メソッドを呼び出す。


上記方法で試すと
Windowsのシャットダウンダイアログが表示されてしまいます。
これを表示せずに自動で落とす方法はありませんか?

ShutdownWindows() メソッドの引数かなにかがあるのかな?
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2004-06-07 10:43
C#ですけど、WMIを使う例です。
http://homepage3.nifty.com/dotnetfan/console/console24.html

rebootのサンプルをちょっと書き換えればシャットダウンになります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-07 11:23
じゃぁ、P/INVOKEの例を・・・と思ったのですが、ソースを紛失していました。

 Borland C++ Builder6で作ったもの…こういう手順でやる、ということで。
コード:
// このプロセスのアクセストークンを取得する
ret = OpenProcessToken(GetCurrentProcess()
		, (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), &hTkn);
if (ret == 0) {
	char	msg[256];
	string	str("OpenProcessToken Function returns rror status\n");
	GetErrorMessage(msg, sizeof(msg), GetLastError());
	str.append(msg);
	throw Exception(str);
}

// プロセス実行に必要なアクセス権限への接続子を取得する
ret = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME
		, &tkp.Privileges[0].Luid);
if (ret == 0) {
	char	msg[256];
	string	str("LookupPrivilegeValue Function returns error status\n");
	GetErrorMessage(msg, sizeof(msg), GetLastError());
	str.append(msg);
	throw Exception(str);
}

// 特権を変更する
tkp.PrivilegeCount = 1;			// SE_SHUTDOWN_NAME のみを変更する
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;	// 「可能」にする
ret = AdjustTokenPrivileges(hTkn, FALSE, &tkp, 0
		, (PTOKEN_PRIVILEGES) NULL, 0);
if (ret == 0) {
	char	msg[256];
	string	str("AdjustTokenPrivileges Function returns error status\n");
	GetErrorMessage(msg, sizeof(msg), GetLastError());
	str.append(msg);
	throw Exception(str);
}

ret = ExitWindowsEx(flag, 0);
if (ret == 0) {
	char	msg[256];
	string	str("ExitWindowsEx Function returns error status\n");
	GetErrorMessage(msg, sizeof(msg), GetLastError());
	str.append(msg);
	throw Exception(str);
}


void
GetErrorMessage(char *message_buffer, int buffer_length, int err)
{
	int	length;
	LPTSTR	str;

	length = FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_SYSTEM,
		NULL,
		err,
		GetUserDefaultLCID(),
		(LPTSTR) &str,
		buffer_length,
		NULL);
	memset(message_buffer, NULL, buffer_length);
	memcpy(message_buffer, str, (buffer_length < length ? buffer_length : length) - 1);
	LocalFree(str);
}

1

スキルアップ/キャリアアップ(JOB@IT)