編程制作管理員登陸報(bào)警器作者:Tuuzed(土仔) 版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明。http://www.shnenglu.com/tuuzed/archive/2008/03/16/44656.html
某日,你“偶然”登陸到了一臺(tái)服務(wù)器上,在確認(rèn)管理員不在后,開始在服務(wù)器上做起一些見不得人的事來。但,這時(shí)的你一定不是“心定定”,你或許是在想:萬一這時(shí)有用戶登陸進(jìn)來怎么辦?如果有什么程序能在有用戶登陸進(jìn)來時(shí)提醒一下,那該多好。
“自己動(dòng)手,豐衣足食”的時(shí)候又來了。搞個(gè)思路吧:WIN32系統(tǒng)離不開消息,有人登陸應(yīng)該會(huì)給個(gè)消息;得到消息了,判斷是什么人登陸;根據(jù)登陸用戶的權(quán)限做出反應(yīng)。
用戶登陸系統(tǒng)給什么消息?查MSDN,系統(tǒng)會(huì)在用戶登陸或斷開時(shí)發(fā)出WM_WTSSESSION_CHANGE的消息,通過它附帶的參數(shù),可以判斷出是登陸或是斷開。其中WTS_CONSOLE_CONNECT、WTS_REMOTE_CONNECT、WTS_SESSION_LOGON十分有用。
如何通過消息判斷登陸用戶是誰?還是在WM_WTSSESSION_CHANGE消息中,帶有另一個(gè)參數(shù):登陸者的session ID。將session ID傳入API函數(shù)WTSQuerySessionInformation中可以查詢到User Name。
如何判斷用戶權(quán)限?獲取的User Name傳入API函數(shù)NetUserGetInfo中,利用帶出的USER_INFO_1結(jié)構(gòu)中的usri1_priv得到權(quán)限標(biāo)識(shí)。
下面是利用C++Builder做demo的核心代碼:
首先在Form建立時(shí)加入語句:WTSRegisterSessionNotification(frmMain->Handle, NOTIFY_FOR_ALL_SESSIONS),告訴系統(tǒng)有Session消息時(shí)通知Form。記住要傳入的是主Form的Handle,而不是Application的Handle(BCB用戶應(yīng)該知道區(qū)別)。
然后在.H中重載void __fastcall WndProc(Messages::TMessage &Message);在.CPP中實(shí)現(xiàn)它:
在C++ Builder編制程序的時(shí)候,一定要在#include <vcl.h>前先定義#define _WIN32_WINNT 0x0501,要不是的話編譯時(shí)會(huì)提示找不到WM_WTSSESSION_CHANGE定義(具體原因是在winuser.h中,_WIN32_WINNT必須是大于 0x0501系統(tǒng)才定義了WM_WTSSESSION_CHANGE)。最后,在程序退出前,要告訴系統(tǒng)不要再發(fā)消息過來了:WTSUnRegisterSessionNotification。
程序做出來后,我給它起名:Hacker RUN! 中文名:黑客快跑。
Powered by: C++博客 Copyright © 土仔