本文主要是介绍Windows下实现USBkey桌面登录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Gina程序使用描述
在系统启动时,Gina Dll被winlogon.exe装载。开发自定义的Gina Dll。必须实现并导出与winlogon.exe交互的18个标准函数接口,包括WlxNegotiate、WlxInitialize、WlxLoggedOnSAS等)。
WlxNegotiate是winlogon.exe调用的第一个接口函数,进行必要的版本判断;
WlxInitialize,主要完成winlogon.exe特定版本的函数分派表向Gina Dll的传递;
WlxLoggedOnSAS,当winlogon在登录成功状态下,接收到SAS事件,会调用该函数处理。对于不需处理的SAS事件则,直接返回WLX_SAS_ACTION_NONE即可。
Gina程序在注册表中的位置
Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon |
Gina所有的函数
函数 | 描述 |
WlxActivateUserShell | 激活用户外壳程序 |
WlxDisplayLockedNotice | 允许GINA DLL 显示锁定信息 |
WlxDisplaySASNotice | 当没有用户登陆时,Winlogon调用此函数 |
WlxDisplayStatusMessage | Winlogon 用一个状态信息调用此函数进行显示 |
WlxGetStatusMessage | Winlogon 调用此函数获取当前状态信息 |
WlxInitialize | 针对指定的窗口位置进行GINA DLL初始化 |
WlxIsLockOk | 验证工作站正常锁定 |
WlxIslogoffOk | 验证注销正常 |
WlxLoggedOnSAS | 用户已登陆并且工作站没有被加锁,此时接收到SAS事件则调用此函数 |
WlxLoggedOutSAS | 没有用户登陆,如果此时收到SAS事件,则Winlogon 调用此函数 |
WlxLogoff | 请求注销操作时通知GINA DLL |
WlxNegotiate | //Winlogon.exe调用的gina dll中的第一个函数 //使gina dll确认是否支持当前版本的Winlogon.exe //传递给winlogon.exe需要那个版本的接口函数 |
WlxNetworkProviderLoad | 在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数 |
WlxRemoveStatusMessage | Winlogon 调用此函数告诉GINA DLL 停止显示状态信息 |
WlxScreensaverNotify | 允许GINA与屏幕保护操作交互 |
WlxShutdown | 在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡 |
WlxStartApplication | 当系统需要在用户的上下文中启动应用程序时调用此函数 |
WlxWkstaLockedSAS | 当工作站被锁定,如果接收到一个SAS,则Winlogon 调用此函数 |
//
//Winlogon.exe调用的gina dll中的第一个函数
//使gina dll确认是否支持当前版本的Winlogon.exe
//传递给winlogon.exe需要那个版本的接口函数
//
BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion, DWORD *pdwDllVersion)
//
//函数目的: 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
//参数:
// lpWinsta : 工作台的名字
// hWlx] : Winlogon的句柄;gina程序可通过该句柄调用winlogon函数
// pvReserved] :
// pWinlogonFunctions : Winlogon提供的函数分发表, gina只需引用
// pWlxContext : 本工作台的GINA上下文地址,
//
BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved, PVOID pWinlogonFunctions, PVOID *pWlxContext)
//
//用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序
//
BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktop, PWSTR pszMprLogonScript, PVOID pEnvironment)
//
// 当系统处于锁定状态时,Winlogon.exe调用该函数
// 显示一些信息,如锁定者、锁定时间等
//
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
//
// 当没有任何用户登陆时,也可以理解为系统刚启动后的第一次登录
// 可以根据用户的动作模拟SAS事件的发送
//
VOID WINAPI WlxDisplaySASNotice(PVOID pContext)
// 能否锁定工作台:true能锁,false不能锁
BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
//能否注销:true能,false不能
BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
//
//目的:系统登录后且没有被锁,WinLogon收到SAS消息;会调用该函数
//dwSasType: SAS消息[超时、key插入或移除、Ctrl_alt_del]
//返回值:
// ACTION_NONE:什么都不做直接返回正常桌面
// ACTION_LOCK_WKSTA : 锁定工作台等待下个SAS
// ACTION_LOGOFF : 用户注销
// ACTION_SHUTDOWN : 关闭计算机
// ACTION_SHUTDOWN_REBOOT : 重启计算机
// ACTION_SHUTDOWN_POWER_OFF : 用户退出、关闭计算机
// ACTION_PWD_CHANGED : 修改密码
// ACTION_TASKLIST : 调用任务列表
// ACTION_FORCE_LOGOFF : 强迫用户退出
//
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
//
// Winlogon.exe调用该函数,通知gina dll用户注销操作
// 允许gina dll做出相应的处理
//
VOID WINAPI WlxLogoff(PVOID pWlxContext)
//
// Winlogon.exe调用该函数,通知gina dll用户注销操作
//
VOID WINAPI WlxLogoff(PVOID pWlxContext)
//
//在系统关闭之前,Winlogon.exe调用该函数;允许gina dll处理一些系统关闭前的处理//
VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
使用Key登录操作系统的流程
< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />
1 用户按下Ctrl+Alt+Del,激活Winlogon.exe程序
2 winlogon.exe检查注册表项;如果没有,默认为msgina.dll
3 winlogon.exe调用Gina
4 Gina检查用户的状态
5 如果用户是在未登录状态,弹出对话框让用户输入帐号口令
6 用户输入帐号口令
7 Gina传到LSA检查用户的帐号口令
8 LSA从SAM比较用户的帐号口令
9 如果匹配,返回用户的SID
10 Gina返回用户登录token
11 winlogon返回用户登录桌面
SAS消息介绍
Winlogon和GINA 之间传递的SAS消息。GINA监听SAS消息,并通过WlxSasNotify方法通知Winlogon SAS消息,Winlogon收到SAS消息后,调用GINA相应的处理方法。(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/interaction_between_winlogon_and_gina.htm):
Workstation boot:
Winlogon calls the GINA's WlxNegotiate function to notify the GINA about the version of Winlogon in use.
Winlogon calls the GINA's WlxInitialize function to give the GINA the addresses of the support functions, a handle to Winlogon, and to obtain the context information for the GINA (to be used in all future calls to the GINA).
Winlogon is in the logged-out state.
No one is logged on:
(The GINA monitors devices for SAS events).
The GINA calls Winlogon's WlxSasNotify function when a SAS event has been received.
Winlogon calls the GINA's WlxLoggedOutSAS function, allowing the GINA to process a user's identification and authentication information.
When logon is successful, Winlogon is in the logged-on state.
Gina收到sas消息,gina程序调用winlogon的WlxSasNotify函数,winlogon在锁屏后会调用gina的WlxLoggedOutSAS函数,此时应出现密码框供输入。
The user is logged on:
(The GINA monitors devices for SAS events).
The GINA calls Winlogon's WlxSasNotify function when a SAS event has been received.
Winlogon calls the GINA's WlxLoggedOnSAS function, allowing the GINA to present options to the user who is currently logged on.
The user is logged on and wants to lock computer:
(The GINA monitors devices for SAS events). 用户在登录后希望锁计算机
The GINA calls the WlxSasNotify function.
Winlogon calls the GINA's WlxLoggedOnSAS function.
The GINA returns WLX_SAS_ACTION_LOCK_WKSTA.
Winlogon is in the workstation-locked state
用户在登录后,希望锁屏;gina程序调用WlxSasNotify通知winlogon程序,winlogon会调用gina的WlxLoggedOnSAS函数,如果gina程序返回WLX_SAS_ACTION_LOCK_WKSTA表示允许锁屏
The user is logged on; the workstation is locked; and the user wants to unlock computer:
(The GINA monitors devices for SAS events).
The GINA calls the WlxSasNotify function.
Winlogon calls the GINA's WlxWkstaLockedSAS function.
The GINA returns WLX_SAS_ACTION_UNLOCK_WKSTA.
用户在登录后且工作台被锁,用户需要解锁;gina调用winlogon的WlxSasNotify函数,winlogon会调用gina的WlxWkstaLockedSAS函数,返回WLX_SAS_ACTION_UNLOCK_WKSTA表示要解锁。
The user is logged on, and the program calls the ExitWindowsEx function:
Winlogon calls the GINA's WlxLogoff function.
The user is logged on and wants to log off using SAS:
(The GINA monitors devices for SAS events).
The GINA calls the WlxSasNotify function.
Winlogon calls the GINA's WlxLoggedOnSAS function.
The GINA returns WLX_SAS_ACTION_LOGOFF.
Winlogon calls the GINA's WlxLogoff function.
The user is logged on and wants to log off and shut down using ExitWindowsEx:
Winlogon calls the GINA's WlxLogoff function.
Winlogon calls the GINA's WlxShutdown function.
The user is logged on and wants to log off and shut down using SAS:
(The GINA monitors devices for SAS events).
The GINA calls the WlxSasNotify function.
Winlogon calls the GINA's WlxLoggedOnSAS function.
The GINA returns WLX_SAS_ACTION_SHUTDOWN.
Winlogon calls the GINA's WlxLogoff function.
Winlogon calls the GINA's WlxShutdown function.
登录状态转化
2 域登录原理
3 实现USBkey证书登录
message=WM_DEVICECHANGE
lPar= (PDEV_BROADCAST_HDR)
USBkey插入事件
wPar=DBT_DEVICEARRIVAL
USBkey拔出事件
wPar=DBT_DEVICEREMOVECOMPLETE
RegisterDeviceNotification方法注册接收硬件的通知消息
实现流程
1 安装USBkey驱动,把USBkey的登录证书写入系统注册表
2 实现GINA,重写WlxLoggedOutSAS、WlxLoggedOnSAS等方法,GINA监听USBkey的插入或拔出事件。
当USBkey插入时,判断当前状态是否log off或locked,通过WlxSasNotify方法通知Winlogon予WLX_SAS_ACTION_LOGON消息
当USBkey插入时,判断当前状态是否log off或locked,通过WlxSasNotify方法通知Winlogon予WLX_SAS_ACTION_LOGON消息
3 安装GINA,修改注册表项MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDll
这篇关于Windows下实现USBkey桌面登录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!