對於用過Windows的人,幾乎沒有人不知道Ctrl+Alt+Del組合鍵,尤其是在使用經常死機的Windows9x時,使用它的頻率更高,這一組合鍵是專門為了系統安全起見提供的緊急出口。VC知識庫在線雜志第11期,ac952_z_cn在他的個人專欄中寫過一篇關於這方面的文章:“WINDOWS NT/2000下如何屏蔽CTRL+ALT+DEL”。因此本文側重於介紹在Windows XP中如何實現屏蔽CTRL+ALT+DEL組合鍵,也就是任務管理器,任務切換組合鍵(Alt+Tab),任務欄和“開始”菜單(Ctrl+Esc,VK_LWIN,VK_RWIN)。這個方法也能應用於Windows 2000環境。
在Windows 9x/Me系統中,屏蔽Ctrl+Alt+Del和各種任務開關鍵的方法是通過下面的方法實現的:
BOOL bOldState;
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &bOldState, 0);
MS大佬認為這種方法很業余,所以在Windows NT/2000/XP中對此進行了修改。在這些較新的Windows版本中用戶登陸使用Winlogon和GINA——Graphical Identification and Authentication,意思是圖形化的身份認證,挺嚇唬人的是不是!其實就那麼回事。Winlogon是Windows系統的一部分,它專門提供交互式登陸支持,而GINA則是Winlogon用來實現認證的一個DLL——這個DLL就是msgina.dll。WlxInitialize、WlxActivateUserShell便是其中輸出,當然不知這兩個,還有別的。前者進行自身的初始化,後者激活用戶的外殼程序。Windows就是用這個DLL來實現用戶名+口令的身份認證的,但是開發人員可以用自己的GINA代替msgina.dll。例如,實現智能卡、視網膜掃描儀、DNA檢查等等認證機制來代替輸入用戶名+口令形式的身份檢查。 下面的表格中列出了與GINA有關的全部函數。其中有一個是WlxLoggedOnSAS,當按下Ctrl+Alt+Del 鍵時,Winlogon便調用這個函數。
(表一)GINA 函數一覽表 函數 描述
WlxActivateUserShell激活用戶外殼程序
WlxDisplayLockedNotice允許GINA DLL 顯示鎖定信息
WlxDisplaySASNotice 當沒有用戶登陸時,Winlogon調用此函數
WlxDisplayStatusMessageWinlogon 用一個狀態信息調用此函數進行顯示
WlxGetConsoleSwitchCredentials Winlogon調用此函數讀取當前登陸用戶的信任信息,並透明地將它們傳到目標會話
WlxGetStatusMessage Winlogon 調用此函數獲取當前狀態信息
WlxInitialize 針對指定的窗口位置進行GINA DLL初始化
WlxIsLockOk 驗證工作站正常鎖定
WlxIslogoffOk 驗證注銷正常
WlxLoggedOnSAS 用戶已登陸並且工作站沒有被加鎖,如果此時接收到SAS事件,則Winlogon 調用此函數
WlxLoggedOutSAS 沒有用戶登陸,如果此時收到SAS事件,則Winlogon 調用此函數
WlxLogoff 請求注銷操作時通知GINA DLL
WlxNegotiate 表示當前的Winlogon版本是否能使用GINA DLL
WlxNetworkProviderLoad 在加載網絡服務提供程序收集了身份和認證信息後,Winlogon 調用此函數
WlxRemoveStatusMessage Winlogon 調用此函數告訴GINA DLL 停止顯示狀態信息
WlxScreensaverNotify 允許GINA與屏幕保護操作交互
WlxShutdown 在關閉之前Winlogon 調用此函數,允許GINA實現任何關閉任務,例如從讀卡器中退出智能卡
WlxStartApplication 當系統需要在用戶的上下文中啟動應用程序時調用此函數
WlxWkstaLockedSAS當工作站被鎖定,如果接收到一個SAS,則Winlogon 調用此函數
在默認情況下,GINA顯示登陸對話框,用戶輸入用戶名及口令。所以要想屏蔽掉Ctrl+Alt+Del,則可以寫一個新的MyGina.dll,其中提供接口調用msgina.dll的函數WlxLoggedOnSAS,從而實現Ctrl+Alt+Del屏蔽。或者編寫一個鍵盤驅動程序來實現。