公司内主要走.net 路线 选择的服务器多数也是windows server系统
测试环境也不例外
windows多采用远程桌面连接(RDC)的方式进行管理维护,虽然方便,但是比起linux系统的权限控制,要差一些。
测试环境的机器 通常密码传的几乎人尽皆知
开发人员有时就会擅自登陆服务器 修改文件或者配置
导致测试环境与生产环境版本不一致
给测试带来很多问题
而且远程桌面互相踢 也带来很大的不便
采用域控制配置起来也比较麻烦
后来就想采用一种类似白名单的方式,只限制某些人可以远程连接
思路就是在服务端运行一个服务或者程序 不停的检查当前连接进来的远程登陆信息 根据白名单过滤登陆的机器名 如果不在名单内 就关闭连接
查了下资料 发现windows 确实提供相应的Win32API 可以进行远程连接的管理
https://msdn.microsoft.com/en-us/library/aa383494(v=vs.85).aspx
但是.net 程序调windowsAPI 写起来有点麻烦
就看看有没有人用c#封装过类似的轮子
发现还真的有
https://github.com/danports/cassia
封装之后的调用非常简单
提供了远程连接Session的各种状态、信息和控制
string clientName = System.Environment.GetEnvironmentVariable("ClientName"); string serverName = System.Environment.GetEnvironmentVariable("COMPUTERNAME"); ITerminalServicesManager manager = new TerminalServicesManager(); using (ITerminalServer server = manager.GetRemoteServer(serverName)) { server.Open(); foreach (ITerminalServicesSession session in server.GetSessions()) { NTAccount account = session.UserAccount; if (account != null) { if (mlist.Where(a => session.ClientName.Equals(a)).Count() == 0) { if (session.ConnectionState == ConnectionState.Active) { Console.WriteLine(DateTime.Now.ToString() + ":断开远程登陆用户 " + session.ClientName); session.Disconnect(); } } } } }
效果非常不错