当前位置:首页 > 技术问答集
firefox

怎样才能知道系统是在锁定状态和由锁定状态登录回到一般状态??谢谢!

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

如题.  
  谢谢!

· 网友精彩回答:

发表者:musein

希望有帮助:  
  作者姓名   陆其明  
  文章原始出处   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的引用。

发表者:musein

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中定义导出。  
 

发表者:lianglp

因为在返回到用户桌面,系统需要重新overd,  
  你想你应该有一个提供重新显示od表面的函数的吧,所以在onpaint()里面调用这个函数就可以了。  
 

.
© 2006-2008 All Rights Reserved