45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:怎么样使用GINA自定义功能?

怎么样使用GINA自定义功能?

2016-08-30 06:12:14 来源:www.45fan.com 【

怎么样使用GINA自定义功能?

自定义GINA

GINAGraphical Identification and Authentication)是一个由Winlogo.exe加载和使用的DLL,是一个可以自定义和可替换的模块。GINA实现了一个有图形界面的可交互式的用户登录和权限策略。例如,通过替换系统本身自带的GINA可以实现智能卡、虹膜扫描等安全认证的方式来替代Windows NT中默认使用的用户名和密码的登录方式。

怎么样使用GINA自定义功能?

GINA通过SASsecure attention sequences)事件与Winlogon进行交互。默认的GINA监测系统的CTRL+ALT_DEL SAS事件,并把它通知给Winlogon进行相应的处理。一个自定义的GINA必须定义自己的SASWinlogon进行交互。

GINAWinlogon在系统启动时进行加载,并在系统运行过程中一直会被Winlogon调用。所以,和Winlogon 一样,GINA会一直被加载在系统中,并随时都会被调用。系统默认的GINA DLL放在%system%windows/system32XP)目录中,名字是msgina.dll。如果你要用自定义的GINA替换掉系统的GINA可以把自定义的GINA,如mygina.dll拷贝到%system%windows/system32XP)中,并修改注册表键值:HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/WinLogon,增加一个字符串值GinaDLL,值为自定义GINA的名字,如mygina.dll,然后重新启动计算机就可以看到效果了。如果要恢复到原来的GINA,可以删掉在上面添加了的值,然后重新启动系统即可。(注:一般地,用这种方式替换系统GINA在一安全模式登录系统时是没用的。)

在理解GINA的工作方式和过程时,了解Winlogon的各个状态之间的转换非常重要。如下图,显示了Winlogon的给各状态之间的转换和GINA的相应的调用过程。

怎么样使用GINA自定义功能?

要实现一个自定义的GINA必须实现一系列输出函数(详情见MSDN)

BOOL WlxNegotiate ( DWORD, DWORD* );

BOOL WlxInitialize ( LPWSTR, HANDLE, PVOID, PVOID, PVOID* );

VOID WlxDisplaySASNotice( PVOID );

int WlxLoggedOutSAS( PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID *);

BOOL WlxActivateUserShell( PVOID, PWSTR, PWSTR, PVOID );

int WlxLoggedOnSAS( PVOID, DWORD, PVOID );

VOID WlxDisplayLockedNotice( PVOID );

int WlxWkstaLockedSAS( PVOID, DWORD );

BOOL WlxIsLockOk( PVOID );

BOOL WlxIslogoffOk( PVOID );

VOID WlxLogoff( PVOID );

VOID WlxShutdown( PVOID, DWORD );

//

// NEW for version 1.1

//

BOOL WlxScreensaverNotify( PVOID, BOOL * );

BOOL WlxStartApplication( PVOID, PWSTR, PVOID, PWSTR );

实现这些函数是自定义一个GINA中最重要但也是最困难的一个步骤。如果你的应用要求很简单,比如只是想取得用户登录的用户名或者屏蔽CTRL+DEL+ALT等,就可以用一种简单方式实现这些函数,直接使用系统默认的msgina.dll的输出函数,方法和使用一般的dll中的输出函数一样,首先用LoadLibrary( )加载msgina.dll,然后用GetProcAddress( )得到各个默认的gina的输出函数的指针,最后要做的只是在你的自定义gina中重新输出需要实现的各个输出函数,实现时调用刚才从msgina.dll中得到的各个默认的输出函数即可,MSDN的示例程序Gina Stub使用的就是这种方法。例如你可以通过以下的方式得到登录的用户名。

Int WINAPI WlxLoggedOutSAS(

PVOID pWlxContext,

DWORD dwSasType,

PLUID pAuthenticationId,

PSID pLogonSid,

PDWORD pdwOptions,

PHANDLE phToken,

PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,

PVOID * pProfile

)

{

Int ret = fnWlxLoggedOutSAS(pWlxContext,

dwSasType,

pAuthenticationId,

pLogonSid,

pdwOptions,

phToken,

pMprNotifyInfo,

pProfile);

//在这里可以得到用户登录的用户名了,就在pMprNotifyInfo结构中

return ret;

}

 

要进一步详细的了解GINAWinlogon可以参阅MSDN和以下的文章:

http://msdn.microsoft.com/msdnmag/issues/05/05/securitybriefs/ 
http://msdn.microsoft.com/msdnmag/issues/05/06/SecurityBriefs/

如果你想用你自己的自定义GINA完全替换系统的GINA,比如定制个性化的登录界面和登录方式等,就需要自己来实现以上的这些输出函数了。当然,这需要比较高的要求了。具体可以参见MSDN中的示例 Gina Sample
 

本文地址:http://www.45fan.com/dnjc/69639.html
Tags: GINA
编辑:路饭网
相关文章列表
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部