windows gina

来源:互联网 发布:python 汉字转拼音 编辑:程序博客网 时间:2024/05/16 15:22

做过windows定制登录的(xp/2000/2003等,vista/win7/2008已经使用了另外一种叫做凭证提供程序的方式了)一定很了解这个了,写这个的主要目的是希望给刚刚接触GINA的同学一些帮助(但愿是有用的)!!

GINA英文全名叫做 Graphical Identification and Authentication,是一个图形化的登录认证模块.

首先让我们看一下windows的登录过程,了解一下GINA在登录环节中的位置

打开任务管理器,会看到一个叫做winlogon的进程,这个进程在windows做好一些初始化工作后会被启动,并且将一直存在直到系统关闭.

winlogon是windows负责用户登录、认证之类操作的进程,winlogon启动时回查看注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WInlogon的GinaDll项,

如果发现设置了这一项,则winlogon将使用GinaDll指定的动态模块,否则的话加载msgina.dll(在系统目录下)。

当有用户登录、锁屏、关机等SAS事件时,winlogon会探测到,winlogon通过调用GINA模块中导出的函数来完成这些SAS事件的处理。

 

开发定制GINA是一件比较繁琐的事情,需要你对windows的安全机制有很深的了解,一般情况下我们也用不着这么做(自己定制GINA除了开发繁琐外稳定性也是一大挑战),大部分人的做法是只定制(重写函数)自己感兴趣的一些操作,其他的操作通过转调msgina.dll来实现.完成这样的工作你需要:

1. 对gina导出函数有所了解

2. 了解各个函数的基本用处和调用顺序

 

首先说下gina的导出函数

WlxNegotiate

WlxInitialize

WlxDisplaySASNotice

WlxLoggedOutSAS

WlxActivateUserShell

WlxLoggedOnSAS

WlxDisplayLockedNotice

WlxWkstaLockedNotice

WlxlsLockOk

WlxlsLogoffOk

WlxLogoff

WlxShutdown

WlxStartApplication(v1.1 新增)

WlxScreenSaverNotify(v1.1新增)

WlxNetworkProviderLoad(v1.3新增)

WlxDisplayStatusMessage(v1.3新增)

WlxGetStatusMessage(v1.3新增)

WlxRemoveStatusMessage(v1.3新增)

WlxGetConsoleSwitchCredentials(v1.4新增)

WlxReconnectNotify(v1.4新增)

WlxDisconnectNotify(v1.4新增)

不同的平台会要求你导出上面这些导出函数的部分或全部函数.可以在平台运行库的事例代码中找到微软提供的gina事例,可以在这个基础上

修改实现你需要完成的功能,下面说下函数的作用

函数说明:

BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion);

这个函数用来完成winlogon和gina的版本协商,用以确定gina是否支持当前版本的winlogon程序(如果大部分接口希望使用msgina的可以在这个函数里加载

msgina模块-LoadLibrary,并通过GetProcessAddress导出需要的函数)

 

BOOL WINAPI WlxActicateUserShell(PVOID pWlxContext, PWSTR pszDesktopName, PWSTR pszMprLogonScript, PVOID pEnvironment)

用户登录成功后,winlogon调用此函数启动用户shell

 

VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)

系统要锁定,调用该函数实现锁定(修改用户当前状态,显示锁定信息等)

 

VOID WINAPI WlxDisplaySASNotice(pWlxContext)

无任何用户登录时,调用此函数显示一些提示信息,引导用户操作

 

BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)

试图锁定时winlogon通过调用该函数判断是否可以锁定

 

BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)

winlogon 调用此函数判断是否可以注销

 

int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, PWORD dwSasType, PVOID pReserved)

系统当前已经处于登录状态时(未处于锁定状态),winlogon接收到SAS时间后会调用该函数

 

int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId,  PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken,

 PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID *pProfile)

当没有用户处于登录状态(包括已登录后锁定状态),winlogon接收到SAS事件后会调用该函数

 

 

VOID WINAPI WlxLogoff(PVOID pWlxContext)

用户注销时winlogon调用该函数

 

...

 

其他函数自己做实验吧.大部分定制gina要自己实现WlxLoggedOutSAS这个函数的,在这个函数里处理你关心的SAS事件,如CTRL+ALT+DEL、用户登录等

 

 

 

在最后想说明一下关于有些时候安装了自己的gina后会出现远程桌面无法用,会有不兼容的xxgina.dll等提示,这种情况是因为你没有导出WlxGetConsoleSwitchCredentials函数的缘故