在NT/2000/XP/2003中,WinLogon調用GINA?DLL實現,GINA?DLL提供了壹個交互式接口,為用戶登錄提供身份驗證請求。WinLogon會和GINA在壹起?DLL進行交互,默認是MSGINA.DLL(在System32目錄下)。微軟也給我們提供了接口,我們就可以自己寫GINA了?DLL來替換MSGINA.DLL。
WinLogon在初始化時將創建三個桌面:
Winlogon桌面:主要顯示Windows?安全界面,比如妳按CTRL+ALT+DEL,登錄界面等。
應用桌面:我們通常看到的與我的電腦的界面。
屏保桌面:屏保顯示界面。
默認情況下,GINA顯示登錄對話框,用戶輸入用戶名和密碼。。所以弄個用戶名和密碼?,妳可以寫壹個新的吉娜?DLL,它提供了壹個調用msgina.dll的函數WlxLoggedOutSAS的接口。
二、方案實施
吉娜?DLL將輸出以下函數(winlogon將調用這些函數):
(表1)吉娜?功能列表
功能描述
WlxActivateUserShell?激活用戶外殼
WlxDisplayLockedNotice?允許吉娜?DLL?顯示鎖定信息
當沒有用戶登錄時,WlxDisplaySASNotice Winlogon調用此函數。
WlxDisplayStatusMessage?Winlogon?調用此函數並顯示狀態消息。
WlxgetConsoleSwitchCredentials Winlogon調用此函數讀取當前登錄用戶的信任信息,並將它們透明地傳輸到目標會話。
WlxGetStatusMessageWinlogon?調用這個函數來獲取當前狀態信息。
wlx初始化指定窗口位置的GINA?DLL初始化
WlxIsLockOk驗證工作站是否正常鎖定。
WlxIslogoffOk驗證註銷是否正常。
WlxLoggedOnSAS用戶已登錄,工作站未鎖定。如果此時收到SAS事件,Winlogon?調用這個函數
WlxLoggedOutSAS沒有用戶登錄。如果此時收到SAS事件,Winlogon?調用這個函數。這個?表明?那個?答?登錄?嘗試?應該?是嗎?造的?。
WlxLogoff請求註銷操作時通知GINA?DLL?
WlxNegotiate表示當前的Winlogon版本是否可以使用GINA?動態鏈接庫
WlxNetworkProviderLoad加載網絡服務提供程序並收集標識和身份驗證信息後,Winlogon?調用這個函數
WlxRemoveStatusMessageWinlogon?調用這個函數告訴GINA?DLL?停止顯示狀態信息
WlxScreensaverNotify允許GINA與屏幕保護程序操作進行交互。
關閉前關閉Winlogon?調用此函數允許GINA執行任何關閉任務,例如從讀卡器退出智能卡。
當系統需要在用戶的上下文中啟動壹個應用程序時,WlxStartApplication調用這個函數。
WlxWkstaLockedSAS?當工作站被鎖定時,如果收到SAS,Winlogon?調用這個函數
為了簡化編程,我們可以從MSGINA.DLL動態獲取上述函數,直接調用MSGINA。自定義DLL(以下簡稱MyGina)中DLL的函數。DLL)。現在我們必須處理WlxLoggedOutSAS函數:
int?WINAPI?WlxLoggedOutSAS(PVOIDpWlxContext,
DWORDdwSasType,
PLUIDpAuthenticationId,
PSID?pLogonSid,
PDWORD?pdwOptions,
PHANDLEphToken,
PWLX_MPR_NOTIFY_INFO?pMprNotifyInfo,
PVOID?*pProfile)
{
//= = = = = = = = = = = = = = = = = = = =加入我的登錄= = = = = = = = = = = = = = = = = = =
克洛金?登錄;
如果?(登錄。DoModal()==IDCANCEL)
{
回歸?WLX _ SAS _ ACTION _ NONE
}
if(login.bCLOSE==TRUE)
{
回歸?WLX _ SAS _ ACTION _ SHUTDOWN
}
如果(登錄。DoModal()==IDOK)
{
夏爾?用戶名[40];
夏爾?密碼[40];
夏爾?password 2[40];
strcpy(用戶名,應用程序。my user);
strcpy(密碼,應用程序。my pass);
//為了演示方便,直接在程序中對比密碼,將默認的管理員賬號設置為自動登錄。
//自動登錄功能SetAutoLogon
strcpy(PassWord2,theApp。my pass 2);
//AfxMessageBox(用戶名);
//AfxMessageBox(密碼);
如果(!strcmp(用戶名,“管理員”))
如果(!strcmp(密碼,“123”))
如果(!strcmp(密碼2," 456 "))
{
SetAutoLogon("管理員",""," 123 ");
回歸?theApp。MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,
?pLogonSid、pdwOptions、phToken、pMprNotifyInfo、ppro file);
}
}
AfxMessageBox("密碼或用戶名錯誤!無法登錄!”);
回歸?WLX _ SAS _ ACTION _ NONE
}
然後設計登陸框,實現自己的界面。該示例如圖所示。
三。安裝和預防措施:
①寫GIAN?小心DLL,吉娜?DLL使用unicode。
(2)安裝GINA?DLL的安裝:
1.?添加註冊表
鍵名?:
\ HKEY _ LOCAL _ MACHINE \ Software \ Microsoft \ windows nt \ current version \ Winlogon
變量名?:?吉納德爾
可變類型?:?[註冊_SZ]
內容?:?“妳的吉娜?“DLL的名稱?如:“MyGina。動態鏈接庫:
2.?妳的吉娜會嗎?DLL(MyGina.dll)復制到系統目錄(system32);
3.?重啟機器,妳的吉娜?DLL(MyGina.dll)將運行。
註意
1)如果它進不了妳的系統,進入DOS後把msgina.dll復制到妳的GINA裏?可以輸入DLL(mygina . DLL);或者進入安全模式並刪除該鍵值(?吉納德爾?)。
2)控制臺?如果壹個程序想要使用MFC類,它必須包含
3)如果出現此錯誤:“鏈接?:?致命?錯誤?LNK1104:?不能?開放?文件?”mfc42u.lib "?",那解釋壹下?Lib路徑設置問題,您的鏈接器在指定的目錄中沒有找到這個文件,您應該添加壹個新的目錄以便編譯器可以找到所需的庫文件。位置:IDE中的工具\選項\目錄\顯示?目錄?for\?& lt圖書館?文件& gt。
4)如果出現此錯誤:“uafxcwd.lib(dllmodul.obj)?:?錯誤?LNK2005:?_DllMain@12?已經嗎?定義?在?main.obj?”還是“MFC 42 ud . lib(dll module . obj)?:?錯誤?LNK2005:?_DllMain@12?已經嗎?定義?在?main.obj?”,然後“看到了嗎?如果?妳呢。有嗎?_AFXDLL?然後呢。_USRDLL?在?那個?預處理器?定義。?試試?移除?壹個?的?他們.位置:在IDE中?菜單項目?\?設定?\?C/C++?\?預處理器?定義?。