• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            關(guān)閉計(jì)算機(jī)就這幾招

            注:完全翻譯整理自MSDN。非常簡(jiǎn)單. .

            系統(tǒng)ShutDown”屬于Windows系統(tǒng)的一種基本服務(wù)。功能上有關(guān)閉系統(tǒng)注銷用戶鎖定工作站”3中操作。SDK中提供了幾個(gè)函數(shù),來對(duì)此服務(wù)進(jìn)行調(diào)用。

            關(guān)閉系統(tǒng)功能使計(jì)算機(jī)可以被安全的關(guān)閉。所有在文件系統(tǒng)里緩沖的內(nèi)容都被強(qiáng)制寫入磁盤。然后,顯示相應(yīng)的對(duì)話框,提示用戶計(jì)算機(jī)將被關(guān)閉或者已經(jīng)準(zhǔn)備好被關(guān)閉。可選的情況一般是計(jì)算機(jī)在關(guān)閉后重起,而不是直接切斷電源。

            如果一個(gè)進(jìn)程調(diào)用注銷功能函數(shù),則該進(jìn)程所在的安全環(huán)境范圍內(nèi)的所有進(jìn)程都被終止,使當(dāng)前的用戶退出系統(tǒng)。一個(gè)登陸對(duì)話框被顯示,期待新用戶的登陸。

            鎖定工作站功能使你可以在離開計(jì)算機(jī)的時(shí)候,保護(hù)計(jì)算機(jī)屏幕不被未授權(quán)的用戶看到。要解除鎖定,必須用管理員或著授權(quán)用戶的帳號(hào)和密碼重新登陸。

            如何關(guān)閉系統(tǒng):

            程序可以用兩種方式關(guān)閉本地或遠(yuǎn)程計(jì)算機(jī)
            直接關(guān)閉系統(tǒng)
            關(guān)閉系統(tǒng)并重啟
            Windows NT/2000
            及后續(xù)版本: 程序必須擁有SE_SHUTDOWN_NAME權(quán)限才能成功調(diào)用關(guān)閉函數(shù)。


            ExitWindowsEx
            函數(shù)可以用來關(guān)閉系統(tǒng)。如函數(shù)成功調(diào)用,系統(tǒng)對(duì)每個(gè)窗口發(fā)送WM_QUERYENDSESSION 消息,詢問窗口所屬的程序是否可以被終止。收到此消息的程序應(yīng)該進(jìn)行響應(yīng),清除環(huán)境釋放資源,然后返回TRUE表示自己可以被終止。然而調(diào)用ExitWindowEx的時(shí)候如果指定了EXW_FORCE,則系統(tǒng)強(qiáng)行終止相關(guān)的進(jìn)程并關(guān)閉,這樣可能導(dǎo)致數(shù)據(jù)的丟失。

            這是一段在NT/2000中調(diào)用ExitWindowEx關(guān)閉系統(tǒng)的程序(強(qiáng)制關(guān)閉所有程序)。

            windows95/98/me中直接調(diào)用ExitWindowEx即可。
            -----------------------------------------------------------------------------------------------------------


            HANDLE hToken;
            TOKEN_PRIVILEGES tkp;

            // Get a token for this process.

            if (!OpenProcessToken(GetCurrentProcess(),

            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))


            Error("OpenProcessToken");

            // Get the LUID for the shutdown privilege.

            LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
            &tkp.Privileges[0].Luid);

            tkp.PrivilegeCount = 1; // one privilege to set

            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

            // Get the shutdown privilege for this process.

            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,

            (PTOKEN_PRIVILEGES)NULL, 0);

            // Cannot test the return value of AdjustTokenPrivileges.

            if (GetLastError() != ERROR_SUCCESS)

            error("AdjustTokenPrivileges");

            // Shut down the system and force all applications to close.

            if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))

            error("ExitWindowsEx");

            -----------------------------------------------------------------------------------------------------------

            Windows NT/2000
            以及后續(xù)版本:

            InitiateSystemShutdown
            函數(shù)可以指定一段延時(shí),在進(jìn)行延時(shí)計(jì)數(shù)的時(shí)候,在將被關(guān)閉的目標(biāo)計(jì)算機(jī)上顯示一個(gè)對(duì)話框,提示用戶盡快注銷。一旦計(jì)數(shù)結(jié)束,系統(tǒng)則立刻被關(guān)閉。在此之前,可以調(diào)用AbortSystemShutdown函數(shù)停止計(jì)數(shù),取消相應(yīng)的關(guān)閉操作。InitiateSystemShutdown也可以指定讓系統(tǒng)重啟。


            InitiateSystemShutdown
            有一個(gè)參數(shù)LPTSTR lpMachineName,可以指定為網(wǎng)絡(luò)上的計(jì)算機(jī)名字,也就是說,可以關(guān)閉網(wǎng)絡(luò)上的他計(jì)算機(jī)(如果你的用戶在該計(jì)算機(jī)上有足夠的權(quán)限的話)。


            以下這個(gè)例子調(diào)用InitiateSystemShutdown函數(shù)關(guān)閉用戶已經(jīng)登陸的本地計(jì)算機(jī)(要關(guān)閉遠(yuǎn)程計(jì)算機(jī)將InitSystemShutdown第一個(gè)參數(shù)由NULL改為正確的計(jì)算機(jī)名字或)。同樣的,也需要先獲得SE_SHUTDOWN_NAME權(quán)限。


            ---------------------------------------------------------------------------------------------------------

            HANDLE hToken; // handle to process token

            TOKEN_PRIVILEGES tkp; // pointer to token structure

            BOOL fResult; // system shutdown flag

            // Get the current process token handle so we can get shutdown

            // privilege.

            if (!OpenProcessToken(GetCurrentProcess(),

            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))

            ErrorHandler("OpenProcessToken failed.");

            // Get the LUID for shutdown privilege.

            LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
            &tkp.Privileges[0].Luid);

            tkp.PrivilegeCount = 1; // one privilege to set

            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

            // Get shutdown privilege for this process.

            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,



            (PTOKEN_PRIVILEGES) NULL, 0);

            // Cannot test the return value of AdjustTokenPrivileges.

            if (GetLastError() != ERROR_SUCCESS)

            ErrorHandler("AdjustTokenPrivileges enable failed.");

            // Display the shutdown dialog box and start the time-out countdown.

            fResult = InitiateSystemShutdown( NULL, // shut down local computer

            "Click on the main window and press \

            the Escape key to cancel shutdown.", // message to user

            20, // time-out period

            FALSE, // ask user to close apps

            TRUE); // reboot after shutdown


            if (!fResult)


            {

            ErrorHandler("InitiateSystemShutdown failed.");

            }
            // Disable shutdown privilege.


            tkp.Privileges[0].Attributes = 0;


            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,


            (PTOKEN_PRIVILEGES) NULL, 0);


            if (GetLastError() != ERROR_SUCCESS)


            {

            ErrorHandler("AdjustTokenPrivileges disable failed.");

            }

            ---------------------------------------------------------------------------------------------
            而使用AbortSystemShutoown取消InitialSystemShutdown操作的代碼如下(記住要在延時(shí)結(jié)束前執(zhí)行才能起作用


            // Get the current process token handle so we can get shutdown

            // privilege.


            if (!OpenProcessToken(GetCurrentProcess(),

            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))

            {

            ErrorHandler("OpenProcessToken failed.");

            }


            // Get the LUID for shutdown privilege.


            LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,

            &tkp.Privileges[0].Luid);


            tk
            p.PrivilegeCount = 1; // one privilege to set


            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


            // Get shutdown privilege for this process.


            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,

            (PTOKEN_PRIVILEGES)NULL, 0);


            // Cannot test the return value of AdjustTokenPrivileges.


            if (GetLastError() != ERROR_SUCCESS)


            {

            ErrorHandler("AdjustTokenPrivileges enable failed.");

            }

            // Prevent the system from shutting down.

            fResult = AbortSystemShutdown(NULL);

            if (!fResult)

            {

            ErrorHandler("AbortSystemShutdown failed.");

            }

            // Disable shutdown privilege.

            tkp.Privileges[0].Attributes = 0;

            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,

            (PTOKEN_PRIVILEGES) NULL, 0);

            if (GetLastError() != ERROR_SUCCESS)

            {

            ErrorHandler("AdjustTokenPrivileges disable failed.");

            }

            break;

            關(guān)于用戶權(quán)限(Privileges)的詳細(xì)信息,可以參見MSDN

            如何注銷當(dāng)前用戶


            可以使用ExitWindowsExitWindowsEx函數(shù)注銷當(dāng)前用戶。

            在默認(rèn)的情況下,當(dāng)程序調(diào)用ExitWindowsExitWindowsEx注銷的時(shí)候,WM_QUERYENDSESSION消息也被發(fā)送到系統(tǒng)內(nèi)的每個(gè)窗口。窗口所屬的程序響應(yīng)此消息并且返回TRUE表示可以被關(guān)閉,如果任意一個(gè)程序返回FALSE,注銷操作將被取消。

            Windows NT/2000
            以及后續(xù)版本:

            當(dāng)一個(gè)程序響應(yīng)WM_QUERYENDSESSION并返回TRUE,那么它就會(huì)立刻接受到WM_ENDSESSION消息并馬上結(jié)束,而不管其他的程序是怎么樣回應(yīng)WM_QUERYENDSESSION消息的。

            Windows 95/98/Me:
            只有當(dāng)系統(tǒng)內(nèi)所有的程序都對(duì)WM_QUERYENDSESSION消息回應(yīng)TRUE之后,他們才會(huì)一起接受到WM_ENDSESSION 消息,然后結(jié)束。

            如果要強(qiáng)制關(guān)閉所有的程序,使用ExitWindowsEx函數(shù),指定EXW_FORCE標(biāo)志。如果這樣做,系統(tǒng)不發(fā)送WM_QUERYENDSESSION 消息,而直接終止正在運(yùn)行的程序。

            在注銷的時(shí)候,系統(tǒng)還向每一個(gè)進(jìn)程發(fā)送CTRL_LOGOFF_EVENT 控制碼。控制臺(tái)程序可以注冊(cè)一個(gè)HandlerRoutine例程來處理這個(gè)控制碼(使用SetConsoleCtrlHandler函數(shù))。(更多的關(guān)于控制臺(tái)的控制碼,參見MSDN“HandlerRoutine”有關(guān)章節(jié))

            綜上所述:只有所有的程序都允許退出,注銷操作才能成功。如果某一個(gè)程序響應(yīng)WM_QUERYENDSESSION并返回FALSE ,用戶則不能被注銷。這樣就可以寫出防止用戶注銷或關(guān)閉的程序(非強(qiáng)制情況)。

            //
            這是注銷當(dāng)前用戶的代碼

            ExitWindows(0, 0);

            //
            響應(yīng)WM_QUERYENDSESSION消息,如果在彈出消息框里選擇NO,則取消注銷。

            case WM_QUERYENDSESSION:

            {

            int r;

            r = MessageBox(NULL, "Shut down?","WM_QUERYENDSESSION", MB_YESNO);

            // Return TRUE to allow shutdown, FALSE to stop.

            return r == IDYES;

            break;

            }

            如何鎖定工作站

            使用LockWorkStation函數(shù)即可鎖定工作站。系統(tǒng)會(huì)顯示一個(gè)鎖定對(duì)話框,告訴用戶此工作站正在使用并且已經(jīng)被鎖定,可以被執(zhí)行鎖定的用戶或管理員解鎖,解鎖的方式是按下CTRL_ALT_DEL并用正確的帳號(hào)和密碼登陸。

            LockWorkStation
            函數(shù)成功調(diào)用的條件是:

            調(diào)用者必須是運(yùn)行在系統(tǒng)交互桌面上的一般進(jìn)程。

            必須已經(jīng)有用戶登陸到系統(tǒng)

            工作站未被鎖定。

            擁有正常窗口和消息隊(duì)列的程序通過WM_QUERYENDSESSIONWM_ENDSESSION消息獲得關(guān)閉通知。

            控制臺(tái)則是在其控制流程(Handle Routines)里接受關(guān)閉通知。要注冊(cè)一個(gè)控制臺(tái)控制流程,應(yīng)該使用SetConsoleCtrlHandler函數(shù)

            服務(wù)程序在其控制流程里接受退出通知。要注冊(cè)一個(gè)服務(wù)控制流程,應(yīng)該使用RegisterServiceCtrlHandlerEx函數(shù)。

            關(guān)閉系統(tǒng)函數(shù)列表

            函數(shù)名                函數(shù)功能描述

            AbortSystemShutdown
                      取消由InitSystemShutdown引起的系統(tǒng)關(guān)閉操作

            ExitWindows
                          注銷當(dāng)前用戶

            ExitWindowsEx
                         注銷用戶,關(guān)閉計(jì)算機(jī),關(guān)閉計(jì)算機(jī)并且重啟

            InitiateSystemShutdown
                     發(fā)起關(guān)閉系統(tǒng)操作,可以選擇關(guān)閉后重啟

            InitiateSystemShutdownEx
                    同InitiateSystemShutdown,擴(kuò)展的功能是可以在系統(tǒng)
                                事件日志(事件號(hào)6006)中寫入一個(gè)用戶指定的雙字節(jié)碼

            LockWorkStation
                        鎖定工作站


            系統(tǒng)關(guān)閉消息

            WM_ENDSESSION

            wParam

            表示是否要終止程序。如果是TRUE,指令該程序終止,否則是FALSE

            lParam

            表示用戶注銷還是系統(tǒng)被關(guān)閉。如果此參數(shù)包含ENDSESSION_LOGOFFlParam在這里是按位取值的)位,則表示是用戶注銷

            Windows 2000
            以及后續(xù)版本:如果lParam ==0,則表示系統(tǒng)被關(guān)閉。

            程序收到此消息,如果wParamTRUE,在完成消息處理后,程序隨時(shí)都有可能被關(guān)閉。所以在此消息的處理過程里,應(yīng)該盡量完成程序銷毀前所需要進(jìn)行的工作。

            WM_QUERYENDSESSION

            wParam

            保留,未使用

            lParam

            WM_ENDSESSION;

            DefWindowProc
            默認(rèn)返回:TRUE

             

            posted on 2008-10-12 16:00 肥仔 閱讀(378) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows開發(fā)

            亚洲AV无码久久精品狠狠爱浪潮| 欧美精品九九99久久在观看| 一级A毛片免费观看久久精品| 亚洲国产成人久久综合一 | 色婷婷综合久久久久中文| 久久伊人五月天论坛| 久久亚洲国产中v天仙www | 日韩精品无码久久一区二区三| 97r久久精品国产99国产精| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲日本va中文字幕久久| 久久久久久免费视频| 漂亮人妻被中出中文字幕久久| 伊人久久一区二区三区无码| 亚洲国产成人乱码精品女人久久久不卡 | 久久精品国产网红主播| 国产成人久久精品一区二区三区 | 99久久做夜夜爱天天做精品| 亚洲国产成人久久精品99| 欧美日韩精品久久免费| 久久人人爽人人爽人人AV东京热 | 伊人久久精品无码av一区| 国产高潮国产高潮久久久| 色综合合久久天天综合绕视看| 777久久精品一区二区三区无码| 久久乐国产精品亚洲综合| 国内精品伊人久久久久777| 国产精品久久久亚洲| 青春久久| 97久久精品无码一区二区天美| 国产亚洲精久久久久久无码AV| 久久久久久午夜精品| 成人免费网站久久久| 日韩久久久久中文字幕人妻 | 熟妇人妻久久中文字幕| segui久久国产精品| 狠狠色噜噜色狠狠狠综合久久 | 久久这里的只有是精品23| 99久久精品日本一区二区免费| 久久99久久成人免费播放| 日韩AV无码久久一区二区|