• 0

  • 485

  • 收藏

如何管理众多Window服务器远程桌面账户?

智能的司机

我是老司机

3星期前

前言

如果手头有众多Windows服务器的话,可能经常会用到远程桌面工具,他可以使客户端控制远程电脑,这个客户端可以在任意设备上运行,也包括Android手机,但是在数量多的话,我们就面临以下几个问题。

  1. 如果不知道某个服务在哪台主机上,那我们就要回头在"账本"上查找。
  2. 在账本上查找到信息后,就要手动输入ip、账户、密码,非常繁琐。
  3. 有些服务器需要先打开VPN后才能连接,在这种情况下,如何快速完成。

那么如何抛弃"账本"查找以及快速连接到指定的服务器,并且不需要手动输入密码?

设计

0.需要哪些知识

下面不会展示代码,只是提供一个思路,而要实现,需要我们了解Win32 API、结构体、WPF、以及再C#中如何API声明并且调用。

Win32 API也就是Windows应用程序编程接口(Application Programming Interface),调用这些接口,你可以做到任何你想要的效果。

WPF是微软新一代的图形展示系统,就是做界面的,非常方便简洁,并且还很好看。

1.程序效果是怎么样的?

知道了要解决什么问题,接下来就是设计软件,需要什么样的界面,以及操作方式是怎么样的?就需要自己的想象力。

在我初步的脑海中,窗口是类似于QQ的,可以靠边隐藏,因为,运维人员需要经常连接,使程序靠边隐藏后,鼠标滑动到边上即可出现,非常方便,他的内容也类似于QQ消息列表,并且有个连接按钮,点击后即可连接到远程服务器,无需其他步骤,最终效果如下。

2.语言选择

接下来我们需要选择一门可以调用操作系统API的语言,所以,排除了Java,Java虽然有办法调用,但是非常麻烦,所以最终选择了C#+WPF,C#调用调用Win32 API虽然也得先声明后才能使用,没有c/c++方便,但是重点是WPF,选择了C#,就可以选择WPF,WPF可以快速设计出任何你想要得界面,就像上面那张图一样。

3.逻辑设计

1.如何解决靠边隐藏

对此,我们需要用到两个API,MoveWindow、GetCursorPos,前者用来移动窗口,后者用来获取当前鼠标相对屏幕的位置。

在默认情况下,程序的x位置相对屏幕应该是(-宽度),比如程序宽是300px,那么x位置就是-300px,这样就使得程序在左边应"隐藏"了。

接下来就是开启一个定时器,不停通过GetCursorPos获取鼠标位置,如果鼠标x的位置是0,那么再不断得调用MoveWindow,直到窗口的x位置是0,则停止,这样就解决了滑动出现的效果。

鼠标移出隐藏可以给WPF中window节点指定MouseLeave时触发的函数,触发后不断调用MoveWindow使x位置为(-宽度),其实上面监听移入也可以通过这种方式来完成,也就是指定MouseEnter时触发的函数,但是这样需要让窗口预留1px的位置,也就是让x位置是-299,才能触发,QQ以前就是这样做的,不知道现在是不是。

2. 从自己服务端获取信息

那么远程服务器的ip、密码、账号信息从哪里来?当然是从我们的服务器了,程序启动后从服务器获取这些信息集合,那么就的有个添加信息的窗口,可以随时添加服务器信息。

3.点击连接

点击连接按钮后就剩下自动连接了,但是分为两种情况,一是需要VPN,二是可以直接连接。

再需要VPN的情况下,我们得先启动VPN,但是一些VPN软件有记住密码、自动登录功能,而有的没有,对于有的,我们需要事先设置,然后我们的程序直接启动就行他就行,接着不停得发出ICMP包,c#有专门得Ping类可以完,再ping成功后自动连接,否则尝试x秒后自动退出。

而对于没有的,需要我们控制,这里需要FindWindow、FindWindowEx、SendMessage函数,找到文本框句柄后通过发送WM_SETTEXT消息设置文本内容,然后再发送BM_CLICK给登录按钮,用来点击连接,如果VPN连接快得话,整个过程也就2秒内。

结合FindWindow、FindWindowEx、SendMessage函数,可以控制外部程序的文本框内容,但这不是绝对的。

4. 愚蠢的做法

最后就是通过Process类启动远程桌面工具mstsc,他有个参数/v用来指定远程桌面的ip,启动后接着通过FindWindow、FindWindowEx、SendMessage设置账户和密码即可,但是这不能一气呵成的完成,需要等待,因为再点击连接后,可能会弹出"无法验证远程计算机的身份,是否仍要连接",这时候需要我们的程序控制这个对话框,让他点击"是",点击"是"后才能弹出密码框,然后再设置密码框的内容,最后再发送BM_CLICK消息给登录按钮即可。

再点击登录后还可能还会弹出一个对话框,也是提示"xxx是否连接",我们还要通过SendMessage给"是"按钮发送BM_CLICK消息,整套流程才算结束,如果连接快得话,从点击连接按钮后到进入桌面,用时不过3秒。

但是最后发现,这种做法是很愚蠢的,分为好几种情况,比如如果这台电脑本身是记住了目标服务器凭据的,再mstsc /v ip后会直接进入桌面,不需要输入密码,那么我们的程序还在不停的等待输入密码,显然不合理。但是可以尝试10秒,10秒内无法找到目标窗口即退出。

还有几种情况就不说了,一句两句说不清楚,后来猛然醒悟,我为什么不向系统添加这个主机的凭据?

经过研究会发现,系统确实提供了一个函数CredWrite,他可以向凭据管理器中添加新的凭据。

那么最后就可以这样做,点击连接按钮后,先向系统添加这个远程服务器的凭据,然后运行mstsc /v ip即可,即使可能会弹出"无法验证远程计算机的身份,是否仍要连接",我们手动选择"不再询问",下次就可以直接进入了。

所以以前做法简直脱裤子放屁了。

下面是连接一台虚拟机得效果,这台虚拟机以前没有登录过,不存在任何凭据。

为什么有人不喜欢接受效率更高的办事方法?

下面转自知乎:

免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

服务器

485

相关文章推荐

未登录头像

暂无评论