♣
怎样才能知道系统是在锁定状态和由锁定状态登录回到一般状态??谢谢!
如题.
谢谢!
· 网友精彩回答:
希望有帮助:
作者姓名 陆其明
文章原始出处 http://hqtech.nease.net
介绍:改文发表于《程序员》2001年11期
正文
大家知道,ctrl+alt+del是win2k/nt操作系统默认的系统登录/注销组合键序列,系统级别很高。在应用程序中,想要屏蔽掉该键序列的响应或得到这个“按下”事件,难度是相当大的。本文介绍了一种简单易行的方法,实现在用户登录成功后,按下ctrl+alt+del不再弹出“windows安全”对话框。
关键词:gina
sas
一. 开发原理
首先介绍一下winlogon。windows 2000/nt有三种系统状态:没有用户登录状态、用户成功登录状态以及工作站锁定状态。winlogon是windows 2000/nt操作系统提供交互式登录支持的组件。winlogon有三个组成部分:可执行文件winlogon.exe,提供图形界面认证功能的动态库gina dll,以及一些网络服务提供动态库network provider dll。参考模型如下:
winlogon.exe处理一些下层导出的接口函数,而认证策略是在gina dll中是独立设计的。在系统启动时,gina dll被winlogon.exe装载。microsoft提供了一个默认的gina dll——winnt\system32\msgina.dll,提供了标准的用户名、密码认证模式。gina dll是可替换的,用户可以设计自己的gina dll,以提供其他如智能卡、视网膜、指纹或其他一些认证机制。
开发自定义的gina dll。必须实现并导出与winlogon.exe交互的18个标准函数接口,包括wlxnegotiate、wlxinitialize、wlxloggedonsas等。其中wlxnegotiate是winlogon.exe调用的第一个接口函数,进行必要的版本判断,随后调用的是wlxinitialize,主要完成winlogon.exe特定版本的函数分派表向gina dll的传递。笔者还要说明的是wlxloggedonsas函数,这个函数主要的功能是,当winlogon在登录成功状态下,接收到sas事件,于是调用这个函数进行sas事件的识别以及进行各事件的相应处理。
自定义gina dll的使用。比如开发的gina dll文件名为mygina.dll。将该文件放到以下路径:winnt\system32。并修改注册表,如下:
key name: \hkey_local_machine\software\microsoft\windows nt\currentversion\ winlogon
value name: ginadll
value type: [reg_sz]
value: mygina.dll
重新启动计算机mygina.dll即投入使用。
二. 应用实例
应用要求:在用户登录成功状态下,按下ctrl+alt+del时系统不再弹出“widows安全”对话框。由于并不需要改变用户名、密码这种标准的认证模式,所以可以仍然使用msgina.dll中导出的函数接口,而对wlxloggedonsas函数的实现进行必要的改变。
开发环境:windows 2000,pii 400
开发工具:microsoft visual c++ 6.0
开发步骤:
1.新建项目,选择mfc appwizard(dll),项目名输入为mygina。按下“ok”后,选择regular dll with mfc statically linked,按下“finish”。
2.使用view->classwizard为cmyginaapp增加initinstance和exitinstance两个函数的覆盖。注意在stdafx.h中加入#include <winwlx.h>。
3.由于要导入msgina.dll的接口函数,所以在mygina.h中定义接口函数变量类型,如下:
typedef (winapi * negotiate) (dword,pdword);
typedef (winapi * initialize) (lpwstr,handle,pvoid,pvoid,pvoid *);
typedef (winapi * activate_ushell) (pvoid,pwstr,pwstr,pvoid);
typedef (winapi * param_pvoid) (pvoid);
typedef (winapi * disp_status) (pvoid,hdesk,dword,pwstr,pwstr);
typedef (winapi * get_status) (pvoid,dword *,pwstr,dword);
typedef (winapi * logon_sas) (pvoid,dword,pvoid);
typedef (winapi * logout_sas) (pvoid,dword,pluid,psid,pdword, phandle,wlx_mpr_notify_info,pvoid *);
typedef (winapi * network_load) (pvoid,pwlx_mpr_notify_info);
typedef (winapi * scr_saver) (pvoid,bool *);
typedef (winapi * shut_down) (pvoid,dword);
typedef (winapi * start_app) (pvoid,pwstr,pvoid,pwstr);
typedef (winapi * locked_sas) (pvoid,dword);
并在类cmyginaapp中定义成员变量,如下:
private:
hmodule hmsdll;
public:
negotiate mywlxnegotiate;
initialize mywlxinitialize;
activate_ushell mywlxactivateusershell;
param_pvoid mywlxdisplaylockednotice;
param_pvoid mywlxdisplaysasnotice;
disp_status mywlxdisplaystatusmessage;
get_status mywlxgetstatusmessage;
param_pvoid mywlxislockok;
param_pvoid mywlxislogoffok;
logon_sas mywlxloggedonsas;
logout_sas mywlxloggedoutsas;
param_pvoid mywlxlogoff;
network_load mywlxnetworkproviderload;
param_pvoid mywlxremovestatusmessage;
scr_saver mywlxscreensavernotify;
shut_down mywlxshutdown;
start_app mywlxstartapplication;
locked_sas mywlxwkstalockedsas;
注意在mygina.h中说明extern cmyginaapp theapp;以便于程序其他地方对theapp的引用。
4.在mygina.cpp中,实现initinstance如下:
// 得到默认的gina dll
if (hmsdll == null)
{
hmsdll = ::loadlibrary("msgina.dll");
}
// 导入各个接口函数
if (hmsdll != null)
{
mywlxnegotiate = (negotiate) getprocaddress(hmsdll,"wlxnegotiate");
mywlxinitialize = (initialize) getprocaddress(hmsdll,"wlxinitialize");
mywlxactivateusershell=(activate_ushell) getprocaddress(hmsdll,"wlxactivateusershell");
mywlxdisplaylockednotice=(param_pvoid) getprocaddress(hmsdll,"wlxdisplaylockednotice");
mywlxdisplaysasnotice = (param_pvoid) getprocaddress(hmsdll,"wlxdisplaysasnotice");
mywlxdisplaystatusmessage=(disp_status) getprocaddress(hmsdll,"wlxdisplaystatusmessage");
mywlxgetstatusmessage = (get_status) getprocaddress(hmsdll,"wlxgetstatusmessage");
mywlxislockok = (param_pvoid) getprocaddress(hmsdll,"wlxislockok");
mywlxislogoffok = (param_pvoid) getprocaddress(hmsdll,"wlxislogoffok");
mywlxloggedonsas = (logon_sas) getprocaddress(hmsdll,"wlxloggedonsas");
mywlxloggedoutsas = (logout_sas) getprocaddress(hmsdll,"wlxloggedoutsas");
mywlxlogoff = (param_pvoid) getprocaddress(hmsdll,"wlxlogoff");
mywlxnetworkproviderload=(network_load)getprocaddress(hmsdll,"wlxnetworkproviderload");
mywlxremovestatusmessage=(param_pvoid) getprocaddress(hmsdll,"wlxremovestatusmessage");
mywlxscreensavernotify = (scr_saver) getprocaddress(hmsdll,"wlxscreensavernotify");
mywlxshutdown = (shut_down) getprocaddress(hmsdll,"wlxshutdown");
mywlxstartapplication = (start_app) getprocaddress(hmsdll,"wlxstartapplication");
mywlxwkstalockedsas = (locked_sas) getprocaddress(hmsdll,"wlxwkstalockedsas");
}
实现exitinstance如下:
// 卸载dll
if (hmsdll != null)
{
::freelibrary(hmsdll);
hmsdll = null;
}
5.实现接口函数。由于本应用仍然保持msgina.dll的大部分操作,所以mygina.dll的接口函数的实现较为简单。重点需要注意的是wlxloggedonsas函数的实现。当在成功登录状态下,不管接收到什么sas事件,该函数直接返回wlx_sas_action_none而不做其他处理。由于实现的函数较多,笔者仅列出代表性的五个,其余的依理类推。
// winlogon.exe调用的gina dll中的第一个函数
// 使gina dll确认是否支持当前版本的winlogon.exe
// 传递给winlogon.exe需要那个版本的接口函数
bool winapi wlxnegotiate(dword dwwinlogonversion, pdword pdwdllversion)
{
// 直接调用从msgina.dll中导入的函数
return theapp.mywlxnegotiate(dwwinlogonversion,pdwdllversion);
}
// 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
bool winapi wlxinitialize(lpwstr lpwinsta,
handle hwlx,
pvoid pvreserved,
pvoid pwinlogonfunctions,
pvoid * pwlxcontext
)
{
// 直接调用从msgina.dll中导入的函数
return theapp.mywlxinitialize(lpwinsta,hwlx,pvreserved,pwinlogonfunctions,pwlxcontext);
}
// 当系统处于锁定状态时,winlogon.exe调用该函数
// 显示一些信息,如锁定者、锁定时间等
void winapi wlxdisplaylockednotice(pvoid pwlxcontext)
{
theapp.mywlxdisplaylockednotice(pwlxcontext);
}
// 在系统关闭之前,winlogon.exe调用该函数
// 允许gina dll处理一些系统关闭前的处理
void winapi wlxshutdown(pvoid pwlxcontext, dword shutdowntype)
{
theapp.mywlxshutdown(pwlxcontext,shutdowntype);
}
// 当系统处于登陆成功,没有锁定的状态下
// winlogon接收到sas事件,于是调用该函数
// 现屏蔽所有事件,直接返回
int winapi wlxloggedonsas(pvoid pwlxcontext,
dword dwsastype,
pvoid preserved)
{
return wlx_sas_action_none;
}
6.将mygina.dll中实现的所有接口函数,在mygina.def中定义导出。
因为在返回到用户桌面,系统需要重新overd,
你想你应该有一个提供重新显示od表面的函数的吧,所以在onpaint()里面调用这个函数就可以了。
- 更多问题:
- · 谁知道那个IT公司红黑榜的网址是多少???
- · 后台经常报IOException,求助
- · 早上为了上班不迟到,把脚扭伤了.... :-( :-(
- · 如何将string的字符串存到byte中?
- · 请问一个CPrintDialog打印问题?
- · 我的DataGrid怎么在多出来了一个空白的第一列??
- · 关于查询结果的显示顺序问题(在线等,急!!)
- · 做了个东东,想买个域名个空间,各位兄弟知道哪里去买好些.
- · 做了个东东,想买个域名个空间,各位兄弟知道哪里去买好些.
- · 图片焦点问题,100分求助!
- · 做了个东东,想买个域名个空间,各位兄弟知道哪里去买好些.
- · 〔〔〔 上帝 〕〕〕让我来找各位帮忙的,简单查询 解决问题再开帖给100分
- · 做了个东东,想买个域名个空间,各位兄弟知道哪里去买好些.
- · 做了个东东,想买个域名个空间,各位兄弟知道哪里去买好些.
- · 求最小值的SQL语句?
- · 做了个东东,想买个域名个空间,各位兄弟知道哪里去买好些.

