问题描述
请教各位大牛,想开发一个winform项目放在服务器上,请问下如何获取远程连接服务器用户的ip地址,用户的电脑名称和登陆服务器的用户名。知道一种办法是读取windows安全日志,但是想通过监控3389端口获取不知道可不可以?怎么样实现呢
解决方案
解决方案二:
没有评论
解决方案三:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求
解决方案四:
引用2楼Z65443344的回复:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求
是通过udp来抓取数据包吗?
解决方案五:
你的winform程序想放到人家服务器上后,就去黑人家的windows的“远程桌面”系统?先别玩儿这种东西。先学学怎么开发windowservice其实对于学生来说更实际。
解决方案六:
引用3楼Cai_Ethan的回复:
Quote: 引用2楼Z65443344的回复:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求是通过udp来抓取数据包吗?
通过#!@$%#*&。
解决方案七:
引用4楼sp1234的回复:
你的winform程序想放到人家服务器上后,就去黑人家的windows的“远程桌面”系统?先别玩儿这种东西。先学学怎么开发windowservice其实对于学生来说更实际。
不是你想的这样。是要监控自己的服务器,要及时了解到远程服务器登陆的情况。
解决方案八:
引用5楼sp1234的回复:
Quote: 引用3楼Cai_Ethan的回复:
Quote: 引用2楼Z65443344的回复:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求是通过udp来抓取数据包吗?
通过#!@$%#*&。
引用5楼sp1234的回复:
Quote: 引用3楼Cai_Ethan的回复:
Quote: 引用2楼Z65443344的回复:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求是通过udp来抓取数据包吗?
通过#!@$%#*&。
这。。。。
解决方案九:
引用3楼Cai_Ethan的回复:
Quote: 引用2楼Z65443344的回复:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求是通过udp来抓取数据包吗?
知道什么叫抓网卡数据包吗网卡数据包类型多了,TCP的,UDP的,ICMP的你要直接访问网卡去抓取,而不是用上层的协议等别人把数据发到你的UDP端口上去我觉得你连许多基本的常识还没理清楚,还是不要研究高大上的东西比较好
解决方案十:
引用8楼Z65443344的回复:
Quote: 引用3楼Cai_Ethan的回复:
Quote: 引用2楼Z65443344的回复:
可以,不过需要自己抓网卡数据包,而且数据包里只有IP是可以直接获取的要知道电脑名称,你就需要通过IP去访问对方电脑,要知道登陆用户名,你就需要对数据包解析,然后分析里面的请求是通过udp来抓取数据包吗?
知道什么叫抓网卡数据包吗网卡数据包类型多了,TCP的,UDP的,ICMP的你要直接访问网卡去抓取,而不是用上层的协议等别人把数据发到你的UDP端口上去我觉得你连许多基本的常识还没理清楚,还是不要研究高大上的东西比较好
打击了,不过确实是第一次听说抓网卡数据包这东西,是领导交代的任务要弄一个监控远程服务器登陆的用户信息,所以不懂就发帖来请教了。这不是不懂就要问嘛。。。
解决方案十一:
你可以直接搜:局域网抓包工具或者搜:科来数据包生成器看看人家是如何抓包的当然,他们只负责抓包,并不帮你解析包里到底是什么内容你只能看到一堆16进制数,代表什么意思需要你知道通信协议才行
解决方案十二:
引用10楼Z65443344的回复:
你可以直接搜:局域网抓包工具或者搜:科来数据包生成器看看人家是如何抓包的当然,他们只负责抓包,并不帮你解析包里到底是什么内容你只能看到一堆16进制数,代表什么意思需要你知道通信协议才行
OK,谢谢了。
解决方案十三:
没那么复杂,有系统事件的如果是windowsservice,已经有现成的SessionChanged事件,你判断ChangedReason为RemoteConnect(远程连接),成功后登陆会再次触发该事件,ChangedReason变为SessionLogon,注销SessionLogoffwinform中的做法则需要调用P/InvokeAPI,BOOLWTSRegisterSessionNotification(_In_HWNDhWnd,_In_DWORDdwFlags);hWnd是用来接收通知的窗口句柄form.Handle,调用WTSUnRegisterSessionNotification可卸载监听设置监听后,重写Form的WndProc,处理消息体WM_WTSSESSION_CHANGE
解决方案十四:
成功后登陆=>登陆成功后
解决方案十五:
引用12楼dongxinxi的回复:
没那么复杂,有系统事件的如果是windowsservice,已经有现成的SessionChanged事件,你判断ChangedReason为RemoteConnect(远程连接),成功后登陆会再次触发该事件,ChangedReason变为SessionLogon,注销SessionLogoffwinform中的做法则需要调用P/InvokeAPI,BOOLWTSRegisterSessionNotification(_In_HWNDhWnd,_In_DWORDdwFlags);hWnd是用来接收通知的窗口句柄form.Handle,调用WTSUnRegisterSessionNotification可卸载监听设置监听后,重写Form的WndProc,处理消息体WM_WTSSESSION_CHANGE
虽然看不懂。但还是非常感谢了
解决方案:
引用13楼dongxinxi的回复:
成功后登陆=>登陆成功后
你好,有没有具体的例子呢
解决方案:
只要你了解了windows的消息处理机制是很简单的using...usingSystem.Runtime.InteropServices;usingSystem.Security.Principal;classFrmSessionNotificationReciever:Form{constintWM_WTSSESSION_CHANGE=0x02B1;constintNOTIFY_FOR_ALL_SESSIONS=???;//这个值没查到constintBUFFER_SIZE=256;enumSessionChangeReason{//ThesessionidentifiedbylParamwasconnectedtotheconsoleterminalorRemoteFXsession.WTS_CONSOLE_CONNECT=1,//ThesessionidentifiedbylParamwasdisconnectedfromtheconsoleterminalorRemoteFXsession.WTS_CONSOLE_DISCONNECT=2,//ThesessionidentifiedbylParamwasconnectedtotheremoteterminal.WTS_REMOTE_CONNECT=3,//ThesessionidentifiedbylParamwasdisconnectedfromtheremoteterminal.WTS_REMOTE_DISCONNECT=4,//AuserhasloggedontothesessionidentifiedbylParam.WTS_SESSION_LOGON=5,//AuserhasloggedoffthesessionidentifiedbylParam.WTS_SESSION_LOGOFF=6,//ThesessionidentifiedbylParamhasbeenlocked.WTS_SESSION_LOCK=7,WTS_SESSION_UNLOCK=0x8,//ThesessionidentifiedbylParamhasbeenunlocked.WTS_SESSION_REMOTE_CONTROL=0x9,//ThesessionidentifiedbylParamhaschangeditsremotecontrolledstatus.Todeterminethestatus,callGetSystemMetricsandchecktheSM_REMOTECONTROLmetric.WTS_SESSION_CREATE=0xA,//Reservedforfutureuse.WTS_SESSION_TERMINATE=0xB}publicFrmSessionNotificationReciever(){this.Load+=newEventHandler(Form_Load);}protectedoverridevoidWndProc(refMessagem){if(m.Msg==WM_WTSSESSION_CHANGE){intsessionId=m.LParam.ToInt32();switch((SessionChangeReason)m.WParam){caseSessionChangeReason.WTS_REMOTE_CONNECT://远程连接(输入服务器信息后,点击“连接”时触发)break;caseSessionChangeReason.WTS_SESSION_LOGON://连接后,用户信息验证之后登陆成功时触发break;}}base.WndProc(refm);}//根据sessionId获取用户信息publicstaticboolAPIQueryUserDomain(intsessionId,outstringuserDomain){userDomain=null;boolsuccess=false;IntPtrhTokenPrimary=IntPtr.Zero,hTokenUser=IntPtr.Zero;try{//通过PrimaryToken查询UserTokensuccess=WTSQueryUserToken(sessionId,outhTokenPrimary);if(!success){returnfalse;}uintreturnLength;hTokenUser=System.Runtime.InteropServices.Marshal.AllocHGlobal(BUFFER_SIZE);success=GetTokenInformation(hTokenPrimary,TokenClassUser,hTokenUser,BUFFER_SIZE,outreturnLength);if(!success){returnfalse;}vartokenUser=(TOKEN_USER)Marshal.PtrToStructure(hTokenUser,typeof(TOKEN_USER));varaccount=newSecurityIdentifier(tokenUser.User.Sid).Translate(typeof(NTAccount))asNTAccount;if(account==null){returnfalse;}userDomain=account.ToString();returnuserDomain.Length!=0;}finally{if(hTokenPrimary!=IntPtr.Zero)CloseHandle(hTokenPrimary);if(hTokenUser!=IntPtr.Zero)System.Runtime.InteropServices.Marshal.FreeHGlobal(hTokenUser);}}privatevoidForm_Load(objectsender,EventArgse){WTSRegisterSessionNotification(this.Handle,NOTIFY_FOR_ALL_SESSIONS);}}
API声明略去了
解决方案:
constintNOTIFY_FOR_ALL_SESSIONS=???;时间关系,这个值我没查到。你去找Wtsapi32.h文件查到
解决方案:
constintNOTIFY_FOR_ALL_SESSIONS=1;
解决方案:
引用17楼dongxinxi的回复:
constintNOTIFY_FOR_ALL_SESSIONS=???;时间关系,这个值我没查到。你去找Wtsapi32.h文件查到
好的谢谢了
解决方案:
获取客户端浏览器信息和IP地址protectedvoidPage_Load(objectsender,EventArgse){lblInfo.Text="您的IP地址:"+Request.UserHostAddress;}protectedvoidPage_Load(objectsender,EventArgse){//获取浏览器的信息lblinfo.Text="浏览器使用的平台是:"+Request.Browser.Platform+"<br>"+"浏览器类型:"+Request.Browser.Type+"<br>"+"浏览器版本:"+Request.Browser.Version;}
解决方案:
引用20楼xiaoxu_2629603619的回复:
获取客户端浏览器信息和IP地址protectedvoidPage_Load(objectsender,EventArgse){lblInfo.Text="您的IP地址:"+Request.UserHostAddress;}protectedvoidPage_Load(objectsender,EventArgse){//获取浏览器的信息lblinfo.Text="浏览器使用的平台是:"+Request.Browser.Platform+"<br>"+"浏览器类型:"+Request.Browser.Type+"<br>"+"浏览器版本:"+Request.Browser.Version;}
谢谢了,我需要获取的是远程服务器的用户信息
解决方案:
引用21楼Cai_Ethan的回复:
Quote: 引用20楼xiaoxu_2629603619的回复:
获取客户端浏览器信息和IP地址protectedvoidPage_Load(objectsender,EventArgse){lblInfo.Text="您的IP地址:"+Request.UserHostAddress;}protectedvoidPage_Load(objectsender,EventArgse){//获取浏览器的信息lblinfo.Text="浏览器使用的平台是:"+Request.Browser.Platform+"<br>"+"浏览器类型:"+Request.Browser.Type+"<br>"+"浏览器版本:"+Request.Browser.Version;}谢谢了,我需要获取的是远程服务器的用户信息
其实就这个最靠谱,那些说抓网卡数据包的是个什么心态秒秒钟几千个包去分析,筛选?你可以在服务程序里面读出数据,放在其他地方,db,cache,webservice等,然后winform去读.
解决方案:
如果远程桌面的通讯消息能够通过抓包解析出来,谁还敢用windows做服务器?