悲情土仔一生

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  14 随笔 :: 0 文章 :: 74 评论 :: 0 Trackbacks

编程制作管理员登陆报警器

作者:Tuuzed(土仔)    
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.cppblog.com/tuuzed/archive/2008/03/16/44656.html



        某日,你“偶然”登陆到了一台服务器上,在确认管理员不在后,开始在服务器上做起一些见不得人的事来。但,这时的你一定不是“心定定”,你或许是在想:万一这时有用户登陆进来怎么办?如果有什么程序能在有用户登陆进来时提醒一下,那该多好。

        “自己动手,丰衣足食”的时候又来了。搞个思路吧:WIN32系统离不开消息,有人登陆应该会给个消息;得到消息了,判断是什么人登陆;根据登陆用户的权限做出反应。

         用户登陆系统给什么消息?查MSDN,系统会在用户登陆或断开时发出WM_WTSSESSION_CHANGE的消息,通过它附带的参数,可以判断出是登陆或是断开。其中WTS_CONSOLE_CONNECT、WTS_REMOTE_CONNECT、WTS_SESSION_LOGON十分有用。

        如何通过消息判断登陆用户是谁?还是在WM_WTSSESSION_CHANGE消息中,带有另一个参数:登陆者的session ID。将session ID传入API函数WTSQuerySessionInformation中可以查询到User Name。

        如何判断用户权限?获取的User Name传入API函数NetUserGetInfo中,利用带出的USER_INFO_1结构中的usri1_priv得到权限标识。

        下面是利用C++Builder做demo的核心代码:

        首先在Form建立时加入语句:WTSRegisterSessionNotification(frmMain->Handle, NOTIFY_FOR_ALL_SESSIONS),告诉系统有Session消息时通知Form。记住要传入的是主Form的Handle,而不是Application的Handle(BCB用户应该知道区别)。

        然后在.H中重载void __fastcall WndProc(Messages::TMessage &Message);在.CPP中实现它:

 1void __fastcall TfrmMain::WndProc(Messages::TMessage &Message)
 2{
 3    if (Message.Msg==WM_WTSSESSION_CHANGE)
 4    {
 5        switch (Message.WParam)
 6        {
 7            case WTS_CONSOLE_CONNECT:
 8                //控制台登陆,报警。
 9                break;
10            case WTS_CONSOLE_DISCONNECT:
11                break;
12            case WTS_REMOTE_CONNECT:
13                //有远程连接,报警。
14                break;
15            case WTS_REMOTE_DISCONNECT:
16                break;
17            case WTS_SESSION_LOGON:
18                //用户登陆了,报警。
19                break;
20            case WTS_SESSION_LOGOFF:
21                break;
22            case WTS_SESSION_LOCK:
23               break;
24            case WTS_SESSION_UNLOCK:
25                 break;
26            default:
27                //unknown
28        }

29    }

30}
 

 

         在C++ Builder编制程序的时候,一定要在#include <vcl.h>前先定义#define _WIN32_WINNT 0x0501,要不是的话编译时会提示找不到WM_WTSSESSION_CHANGE定义(具体原因是在winuser.h中,_WIN32_WINNT必须是大于 0x0501系统才定义了WM_WTSSESSION_CHANGE)。最后,在程序退出前,要告诉系统不要再发消息过来了:WTSUnRegisterSessionNotification

        程序做出来后,我给它起名:Hacker RUN! 中文名:黑客快跑。

posted on 2008-03-16 23:56 土仔 阅读(2564) 评论(3)  编辑 收藏 引用 所属分类: 土仔黑客

评论

# re: 编程制作管理员登陆报警器 2008-03-17 09:58 GouGou
C++Builder真的很好用吗???  回复  更多评论
  

# re: 编程制作管理员登陆报警器 2008-03-17 10:23 铸铸平板
写的是什么呀,看不太懂  回复  更多评论
  

# re: 编程制作管理员登陆报警器 2008-06-09 03:21 黄军辉
http://hookbase.com/design/List_194.html  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理