作者: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中实现它:
{
if (Message.Msg==WM_WTSSESSION_CHANGE)
{
switch (Message.WParam)
{
case WTS_CONSOLE_CONNECT:
//控制台登陆,报警。
break;
case WTS_CONSOLE_DISCONNECT:
break;
case WTS_REMOTE_CONNECT:
//有远程连接,报警。
break;
case WTS_REMOTE_DISCONNECT:
break;
case WTS_SESSION_LOGON:
//用户登陆了,报警。
break;
case WTS_SESSION_LOGOFF:
break;
case WTS_SESSION_LOCK:
break;
case WTS_SESSION_UNLOCK:
break;
default:
//unknown
}
}
}
程序做出来后,我给它起名:Hacker RUN! 中文名:黑客快跑。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具