正文
InitiateSystemShutdown:
BOOL InitiateSystemShutdown(lpszMachineName,lpszMessage,dwTimeout,fForce App
sClosed,fReboot)
說(shuō)明:InitiateSystemShutdown函數(shù)激活指定的一次關(guān)機(jī)和重啟動(dòng)。
參數(shù):lpszMachineName
指定以MULL終止的用來(lái)指定要關(guān)機(jī)的網(wǎng)絡(luò)名稱(chēng)的字符串。如果lpszMachineName為NULL,
或指向一個(gè)空串,則該函數(shù)關(guān)掉本地計(jì)算機(jī)。
LpszMessage
指向一個(gè)以MULL終止的指定要顯示在關(guān)機(jī)對(duì)話框中的消息的字符串。如果不需要消息,
該參數(shù)可以為NULL。
DwTimeout
指定對(duì)話框應(yīng)該顯示的時(shí)間(按秒計(jì))。在此對(duì)話框顯示期間,可通過(guò)調(diào)用AbortSyste
mShutdown函數(shù)將關(guān)機(jī)停止。
如果DwTimeout不為零,則InitiateSystemShutdown在指定的計(jì)算機(jī)上顯示的一個(gè)對(duì)
話框。該對(duì)話框顯示調(diào)用此函數(shù)的用戶名,顯示由lpszMessage參數(shù)指定的消息,并提示
用戶退出系統(tǒng)。當(dāng)對(duì)話框被創(chuàng)建時(shí)發(fā)出嘟嘟聲,并保持位于系統(tǒng)中其它窗口的上面。此
對(duì)話框可以被移動(dòng),但不能被關(guān)閉。定時(shí)器倒記在強(qiáng)制關(guān)機(jī)之前剩余的時(shí)間。如果用戶
退出系統(tǒng),系統(tǒng)立即關(guān)閉。否則,當(dāng)定時(shí)器到時(shí)間計(jì)算機(jī)才關(guān)機(jī)。
如果DwTimeout為零時(shí),計(jì)算機(jī)關(guān)機(jī),但不顯示此對(duì)話框,并且不能用AbortSystem
Shutdown函數(shù)來(lái)停止關(guān)機(jī)。
fForce AppsClosed
指定對(duì)變化未做保存的應(yīng)用程序是否被強(qiáng)制關(guān)閉。如果這個(gè)參數(shù)為T(mén)RUE,則這樣的
應(yīng)用程序被關(guān)閉。如果這個(gè)參數(shù)為FALSE,則顯示一個(gè)對(duì)話框以提示用戶關(guān)閉這些應(yīng)用程
序。
FReboot
指定計(jì)算機(jī)關(guān)機(jī)之后是否立即重啟。如果這個(gè)參數(shù)為T(mén)RUE,則計(jì)算機(jī)重啟。如果這
個(gè)參數(shù)為FALSE,則系統(tǒng)將所有高速緩存刷新到磁盤(pán)上,清除屏幕,并且顯示一條消息,
指示關(guān)掉電源是安全的。
返回值:如果函數(shù)成功,則返回值為T(mén)RUE;否則,返回值為FALSE。要獲得擴(kuò)展錯(cuò)誤信息
,可使用GetLastError函數(shù)。
注釋?zhuān)阂P(guān)掉本地計(jì)算機(jī),調(diào)用進(jìn)程必須具有SE_SHUTDOWN_NAME特權(quán)。要關(guān)掉一臺(tái)遠(yuǎn)程
計(jì)算機(jī),調(diào)用進(jìn)程必須對(duì)此遠(yuǎn)程計(jì)算機(jī)具有的SE_REMOTE_SHUTDOWN_NAME特權(quán)。缺省情況
下,用戶具有對(duì)他們所有登錄計(jì)算機(jī)的SE_SHUTDOWN_NAME特權(quán),管理員具有對(duì)遠(yuǎn)程計(jì)算
機(jī)的SE_REMOTE_SHUTDOWN_NAME特權(quán)。
例子:
HANDLE hToken;
TOKEN_PRIVILEGEStkp;
//得到進(jìn)程權(quán)標(biāo)
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES && TOKEN_QUERY,&hToken))
return;
//得到關(guān)機(jī)的特權(quán)的LUID
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;//設(shè)置一個(gè)特權(quán)
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//得到進(jìn)程關(guān)機(jī)的特權(quán)
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
::InitiateSystemShutdown(NULL,"關(guān)機(jī)進(jìn)行中!",100,true,true);