你可以通過編程替換掉微軟的MSGINA.DLL,用來實現(xiàn)自己的密碼登陸驗證功能,如圖,我就加入了兩個密碼驗證的功能。
一、原理
在NT/2000
中交互式的登陸支持是由WinLogon調(diào)用GINA DLL實現(xiàn)的,GINA
DLL提供了一個交互式的界面為用戶登陸提供認證請求。WinLogon會和GINA
DLL進行交互,缺省是MSGINA.DLL(在System32目錄下)。微軟同時也為我們提供了接口,我們可以自己編寫GINA
DLL來代替MSGINA.DLL。
WinLogon初始化時會創(chuàng)建3個桌面:
(1)、winlogon桌面:主要顯示W(wǎng)indows 安全等界面,如你按下CTRL+ALT+DEL,登陸的界面等
(2)、應(yīng)用程序桌面:我們平時見到的那個有我的電腦的界面
(3)、屏幕保護桌面:屏幕保護顯示界面。
在默認情況下,GINA顯示登陸對話框,用戶輸入用戶名及密碼 。所以要獲得用戶名和密碼 ,則可以寫一個新的GINA DLL,其中提供接口調(diào)用msgina.dll的函數(shù)WlxLoggedOutSAS。
二、程序?qū)崿F(xiàn)
GINA DLL要輸出下列函數(shù)(winlogon會調(diào)用):
(表一)GINA 函數(shù)一覽表
函數(shù) 描述
WlxActivateUserShell 激活用戶外殼程序
WlxDisplayLockedNotice 允許GINA DLL 顯示鎖定信息
WlxDisplaySASNotice 當沒有用戶登陸時,Winlogon調(diào)用此函數(shù)
WlxDisplayStatusMessage Winlogon 用一個狀態(tài)信息調(diào)用此函數(shù)進行顯示
WlxGetConsoleSwitchCredentials Winlogon調(diào)用此函數(shù)讀取當前登陸用戶的信任信息,并透明地將它們傳到目標會話
WlxGetStatusMessage Winlogon 調(diào)用此函數(shù)獲取當前狀態(tài)信息
WlxInitialize 針對指定的窗口位置進行GINA DLL初始化
WlxIsLockOk 驗證工作站正常鎖定
WlxIslogoffOk 驗證注銷正常
WlxLoggedOnSAS 用戶已登陸并且工作站沒有被加鎖,如果此時接收到SAS事件,則Winlogon 調(diào)用此函數(shù)
WlxLoggedOutSAS 沒有用戶登陸,如果此時收到SAS事件,則Winlogon 調(diào)用此函數(shù), This indicates that a logon attempt should be made 。
WlxLogoff 請求注銷操作時通知GINA DLL
WlxNegotiate 表示當前的Winlogon版本是否能使用GINA DLL
WlxNetworkProviderLoad 在加載網(wǎng)絡(luò)服務(wù)提供程序收集了身份和認證信息后,Winlogon 調(diào)用此函數(shù)
WlxRemoveStatusMessage Winlogon 調(diào)用此函數(shù)告訴GINA DLL 停止顯示狀態(tài)信息
WlxScreensaverNotify 允許GINA與屏幕保護操作交互
WlxShutdown 在關(guān)閉之前Winlogon 調(diào)用此函數(shù),允許GINA實現(xiàn)任何關(guān)閉任務(wù),例如從讀卡器中退出智能卡
WlxStartApplication 當系統(tǒng)需要在用戶的上下文中啟動應(yīng)用程序時調(diào)用此函數(shù)
WlxWkstaLockedSAS 當工作站被鎖定,如果接收到一個SAS,則Winlogon 調(diào)用此函數(shù)
為了簡化編程,我們從MSGINA.DLL中動態(tài)獲取上述函數(shù),在自定義的DLL中(以下稱為MyGina.DLL)中直接調(diào)用MSGINA.DLL的函數(shù)即可?,F(xiàn)在我們要處理的就是WlxLoggedOutSAS函數(shù):
- int WINAPI WlxLoggedOutSAS(PVOID pWlxContext,
- DWORD dwSasType,
- PLUID pAuthenticationId,
- PSID pLogonSid,
- PDWORD pdwOptions,
- PHANDLE phToken,
- PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
- PVOID * pProfile)
- {
- //=========================加入我的登陸=========================
-
-
-
- Clogin login;
- if (login.DoModal()==IDCANCEL)
- {
- return WLX_SAS_ACTION_NONE;
- }
- if(login.bCLOSE==TRUE)
- {
- return WLX_SAS_ACTION_SHUTDOWN;
- }
- if(login.DoModal()==IDOK)
- {
-
- char UserName[40];
- char PassWord[40];
- char PassWord2[40];
-
- strcpy(UserName,theApp.MyUser);
- strcpy(PassWord,theApp.MyPass);
-
- //在這里,我為了簡便,直接在程序里面比較密碼,并且把默認管理員賬號設(shè)置為自動登陸
-
- //自動登陸函數(shù)SetAutoLogon
- strcpy(PassWord2,theApp.MyPass2);
- // AfxMessageBox(UserName);
- // AfxMessageBox(PassWord);
- if(!strcmp(UserName,"Administrator"))
- if(!strcmp(PassWord,"123"))
- if(!strcmp(PassWord2,"456"))
- {
- SetAutoLogon("administrator","","123");
- return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,
- pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);
- }
-
-
- }
- AfxMessageBox("密碼或者用戶名錯誤!不能登陸!");
- return WLX_SAS_ACTION_NONE;
-
- }
然后設(shè)計登陸框,實現(xiàn)自己的界面,具體實現(xiàn)就不再詳細說明了,可以參考代碼。
三、安裝和注意事項:
在編寫GIAN DLL中要注意,GINA DLL使用的是unicode。
引用
【安裝】GINA DLL的安裝:
1. 添加注冊表
鍵名 : \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
變量名 : GinaDLL
變量類型 : [REG_SZ]
內(nèi)容 : "你的GINA DLL的名稱" 如:"MyGina.DLL:
2. 將你的GINA DLL(MyGina.dll)拷貝到系統(tǒng)目錄下(system32);
3. 重啟機器,你的GINA DLL(MyGina.dll)就會運行。
【注意】
1. 如果出現(xiàn)進不了你的系統(tǒng),那你進入DOS后,將msgina.dll拷貝成你的GINA DLL(MyGina.dll)就可進入了;或者進入安全模式,刪除掉那個鍵值( GinaDLL )。
2. Console 程序如果想使用MFC類,必須包含
,同時注釋掉。
3.
如果出現(xiàn)這種錯誤:“LINK : fatal error LNK1104: cannot open file "mfc42u.lib"
”,那么說明
lib路徑的設(shè)置問題,你的鏈接器在指定的目錄下沒有找到這個的文件,你應(yīng)該添加新的目錄以便編譯器找到所需的庫文件。具體位置:IDE中菜單Tools
\Options\Directories\show directories for。
4.
如果出現(xiàn)這種錯誤:“uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12
already defined in main.obj ”或者“mfcs42ud.lib(dllmodul.obj) : error
LNK2005: _DllMain@12 already defined in main.obj ”,那么“See if you have
_AFXDLL and _USRDLL in the preprocessor definitions. Try removing one
of them”。具體位置:IDE中 菜單Project \ Setting \ C/C++ \ preprocessor
definition 。