需求为对局域网内的服务器远程开关机、管理服务进程包括远程启动、关闭、重启。原来的工作方式需要用户手动开启每台服务器,并通过KVM切换到各个服务器并且打开软件服务,工作完成后,手动关闭所有软件及关闭机器。现增加服务管理软件,可以做到一键开启指定的设备及服务,从而减少了启动操作,优化用户使用体验。
服务管理软件包含的功能有:
远程唤醒;
远程关机;
远程进程管理(启动、关闭、重启);
实现方式:
1、远程唤醒功能
目前网卡和主板都支持Wake On Lan功能,需要通过BIOS开启及对允许网卡唤醒计算机。通过发送MagicPacket到网卡即可启动设备,魔术包的格式为FF-FF-FF-FF-FF-FF + 16*MAC地址,即6个FF+16次网卡MAC地址,通过UDP发送即可。
public bool WakeServer(string ip,string macString) { try { var mac = StringToBytes(macString); UdpClient client = new UdpClient(); client.Connect(ip, 7070); byte[] magicPacket = new byte[17*6]; for (int i = 0; i < 6; i++) magicPacket[i] = 0xFF; for (int i = 1; i <= 16; i++) for (int j = 0; j < 6; j++) magicPacket[i * 6 + j] = mac[j]; int result = client.Send(magicPacket, magicPacket.Length); client.Close(); return true; } catch (Exception e) { return false; } }
2、远程进程管理
远程启动软件的方法有多种:
Telnet、ssh
WMI
schtasks
本次使用schtasks来实现。
Schtasks的官方解释:允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务。
通过Schtasks查询(query)、创建(create)、执行(run)既可实现远程打开关闭软件;
本次解决方案是通过Schtasks远程执行各设备的批处理文件,批处理文件可以灵活的实现软件的关闭、启动、关机、重启等等操作。
创建计划任务task,执行时间为10:10:
schtasks /create /s 192.168.0.1 /u administrator /p password /tn task /tr ***.bat /sc once /st 10:10
立即执行task:
schtasks /run /tn task
查询是否存在task,若不存在则创建此任务:
schtasks /query /tn task
3、远程关机
shutdown.exe可以实现远程关机,由于使用了schtasks,为了保持代码的一致性,关机操作以以schtasks启动脚本文件方式来实现关机、重启操作。
shutdown -s -t 0 #关机shutdown -r -t 0 #重启
此软件作为系统的工具使用,设计要求简洁,只具有开机、关机以及一些进程管理功能。以WPF框架实现,直接在UI的隐藏类中实现业务逻辑即可。
总结:
远程启动:发送魔术包可以实现;
远程进程管理:schtasks计划任务、Telnet、WMI等;
远程关机:shutdown.exe
疫情期间,注意防护!Stay Hungary,Stay Young, Forever !
武汉加油 中国加油 !