替换GINA.DLL实现自己的登陆界面 http://www.xiaozhou.net/ReadNews.asp?NewsID=569
2008-11-03 22:42
447 查看
想不想拥有自己个性化的WIN2000登陆界面呢?本文就教你如何实现。
登陆界面示例(这是我在虚拟机上抓的图):
screen.width-333)this.width=screen.width-333" alt="" src="http://www.xiaozhou.net/uploadfile/jpg/2004-12/2004129152523118.jpg" border="0">
你可以通过编程替换掉微软的MSGINA.DLL,用来实现自己的密码登陆验证功能,如图,我就加入了两个密码验证的功能。
一、原理
在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。
WinLogon初始化时会创建3个桌面:
(1)、winlogon桌面:主要显示Windows 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等
(2)、应用程序桌面:我们平时见到的那个有我的电脑的界面
(3)、屏幕保护桌面:屏幕保护显示界面。
在默认情况下,GINA显示登陆对话框,用户输入用户名及密码 。所以要获得用户名和密码 ,则可以写一个新的GINA DLL,其中提供接口调用msgina.dll的函数WlxLoggedOutSAS。
二、程序实现
GINA DLL要输出下列函数(winlogon会调用):
(表一)GINA 函数一览表
为了简化编程,我们从MSGINA.DLL中动态获取上述函数,在自定义的DLL中(以下称为MyGina.DLL)中直接调用MSGINA.DLL的函数即可。现在我们要处理的就是WlxLoggedOutSAS函数:
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);
//在这里,我为了简便,直接在程序里面比较密码,并且把默认管理员帐号设置为自动登陆
//自动登陆函数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;
}
然后设计登陆框,实现自己的界面,具体实现就不再详细说明了,可以参考代码。
三、安装和注意事项:
在编写GIAN DLL中要注意,GINA DLL使用的是unicode。
【安装】GINA DLL的安装:
1. 添加注册表
键名 : /HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Winlogon
变量名 : GinaDLL
变量类型 : [REG_SZ]
内容 : "你的GINA DLL的名称" 如:"MyGina.DLL:
2. 将你的GINA DLL(MyGina.dll)拷贝到系统目录下(system32);
3. 重启机器,你的GINA DLL(MyGina.dll)就会运行。
【注意】
1. 如果出现进不了你的系统,那你进入DOS后,将msgina.dll拷贝成你的GINA DLL(MyGina.dll)就可进入了;或者进入安全模式,删除掉那个键值( GinaDLL )。
2. Console 程序如果想使用MFC类,必须包含<afx.h>,同时注释掉<windows.h>。
3. 如果出现这种错误:“LINK : fatal error LNK1104: cannot open file "mfc42u.lib" ”,那么说明 lib路径的设置问题,你的链接器在指定的目录下没有找到这个的文件,你应该添加新的目录以便编译器找到所需的库文件。具体位置:IDE中 菜单Tools/Options/Directories/show directories for/ <library files>。
4. 如果出现这种错误:“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 。
请点击图标下载浏览:
screen.width-333)this.width=screen.width-333" src="http://www.xiaozhou.net/images/rar.gif" border="0">
附件
登陆界面示例(这是我在虚拟机上抓的图):
screen.width-333)this.width=screen.width-333" alt="" src="http://www.xiaozhou.net/uploadfile/jpg/2004-12/2004129152523118.jpg" border="0">
你可以通过编程替换掉微软的MSGINA.DLL,用来实现自己的密码登陆验证功能,如图,我就加入了两个密码验证的功能。
一、原理
在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。
WinLogon初始化时会创建3个桌面:
(1)、winlogon桌面:主要显示Windows 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等
(2)、应用程序桌面:我们平时见到的那个有我的电脑的界面
(3)、屏幕保护桌面:屏幕保护显示界面。
在默认情况下,GINA显示登陆对话框,用户输入用户名及密码 。所以要获得用户名和密码 ,则可以写一个新的GINA DLL,其中提供接口调用msgina.dll的函数WlxLoggedOutSAS。
二、程序实现
GINA DLL要输出下列函数(winlogon会调用):
(表一)GINA 函数一览表
函数 | 描述 |
WlxActivateUserShell | 激活用户外壳程序 |
WlxDisplayLockedNotice | 允许GINA DLL 显示锁定信息 |
WlxDisplaySASNotice | 当没有用户登陆时,Winlogon调用此函数 |
WlxDisplayStatusMessage | Winlogon 用一个状态信息调用此函数进行显示 |
WlxGetConsoleSwitchCredentials | Winlogon调用此函数读取当前登陆用户的信任信息,并透明地将它们传到目标会话 |
WlxGetStatusMessage | Winlogon 调用此函数获取当前状态信息 |
WlxInitialize | 针对指定的窗口位置进行GINA DLL初始化 |
WlxIsLockOk | 验证工作站正常锁定 |
WlxIslogoffOk | 验证注销正常 |
WlxLoggedOnSAS | 用户已登陆并且工作站没有被加锁,如果此时接收到SAS事件,则Winlogon 调用此函数 |
WlxLoggedOutSAS | 没有用户登陆,如果此时收到SAS事件,则Winlogon 调用此函数, This indicates that a logon attempt should be made 。 |
WlxLogoff | 请求注销操作时通知GINA DLL |
WlxNegotiate | 表示当前的Winlogon版本是否能使用GINA DLL |
WlxNetworkProviderLoad | 在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数 |
WlxRemoveStatusMessage | Winlogon 调用此函数告诉GINA DLL 停止显示状态信息 |
WlxScreensaverNotify | 允许GINA与屏幕保护操作交互 |
WlxShutdown | 在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡 |
WlxStartApplication | 当系统需要在用户的上下文中启动应用程序时调用此函数 |
WlxWkstaLockedSAS | 当工作站被锁定,如果接收到一个SAS,则Winlogon 调用此函数 |
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);
//在这里,我为了简便,直接在程序里面比较密码,并且把默认管理员帐号设置为自动登陆
//自动登陆函数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;
}
然后设计登陆框,实现自己的界面,具体实现就不再详细说明了,可以参考代码。
三、安装和注意事项:
在编写GIAN DLL中要注意,GINA DLL使用的是unicode。
【安装】GINA DLL的安装:
1. 添加注册表
键名 : /HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Winlogon
变量名 : GinaDLL
变量类型 : [REG_SZ]
内容 : "你的GINA DLL的名称" 如:"MyGina.DLL:
2. 将你的GINA DLL(MyGina.dll)拷贝到系统目录下(system32);
3. 重启机器,你的GINA DLL(MyGina.dll)就会运行。
【注意】
1. 如果出现进不了你的系统,那你进入DOS后,将msgina.dll拷贝成你的GINA DLL(MyGina.dll)就可进入了;或者进入安全模式,删除掉那个键值( GinaDLL )。
2. Console 程序如果想使用MFC类,必须包含<afx.h>,同时注释掉<windows.h>。
3. 如果出现这种错误:“LINK : fatal error LNK1104: cannot open file "mfc42u.lib" ”,那么说明 lib路径的设置问题,你的链接器在指定的目录下没有找到这个的文件,你应该添加新的目录以便编译器找到所需的库文件。具体位置:IDE中 菜单Tools/Options/Directories/show directories for/ <library files>。
4. 如果出现这种错误:“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 。
请点击图标下载浏览:
screen.width-333)this.width=screen.width-333" src="http://www.xiaozhou.net/images/rar.gif" border="0">
附件
相关文章推荐
- 替换GINA.DLL实现自己的登陆界面
- 替换GINA.DLL实现自己的登陆界面
- 替换GINA.DLL实现自己的登陆界面[酷狗] 转
- 替换GINA.DLL实现自己的登陆界面
- 替换GINA.DLL实现自己的登陆界面uiu
- 在ASP.Net 中使用实现windows登陆的方法. (轉自tainkai的專欄.http://blog.csdn.net/tainkai)
- awt实现登陆界面+数据库——学java,零基础不怕,不只要理论,更要实践+项目<a href=http://www.bjweixin.com>太原维信科技提供 </a>
- ASP.NET MVC 自己实现登陆验证过滤器
- Ajax+asp.net实现用户登陆 转自http://www.shangxueba.com/jingyan/2933319.html
- 在asp.net中读取XML文件信息的4种方法 (http://www.cnblogs.com/liping19851014/archive/2007/10/16/926137.html)
- ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)
- 在ASP.NET 2.0中开发通配符映射应用程序的一些问题 (转自:http://www.cnblogs.com/dudu/archive/2006/03/07/345107.html)
- Asp.net 登陆页面的Ajax异步身份验证的实现
- 转---在ASP.NET MVC中实现登录后回到原先的界面
- ASP.NET 2.0 HttpHandler实现对某种文件类型权限保护(示例代码下载)
- ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)
- asp.net下结合HttpHandler实现图片防盗链
- VS .NET 2005中水晶报表的使用 http://www.tianyablog.com/blogger/post_show.asp?BlogID=116800&PostID=9731765
- Asp.Net中的脚本回调和Server.Transfer页面传值http://www.zhuye123.com/Article/156/161/2006/2006042328785.html
- 【转】JQuery跨域请求 (转http://www.cnblogs.com/myaspnet/archive/2010/12/30/1922335.html)