网络唤醒

  1. 网络唤醒要接通电源,要接网线,不能是wifi,在同一网段下进行网络唤醒最为省事
  2. 网络唤醒需要终端的主板和网卡支持
    ① 先进入BIOS中开启网络唤醒功能,在BIOS中找到“OnBoard LAN”选项,将它设成 “Enabled”。同时将“POWER MANAGEMENT SETUP(电源管理设置)”下的“Power On by LAN/Ring”选项设为“Enabled”,最后将“Wake On LAN(网络唤醒)”选项设置为“Enabled”(某些计算机的BIOS配置的选项名可能有些许不同)
    ② 右击“我的电脑”并选择“管理”选项,在随后出现的“计算机管理”窗口中找到“设备管理”,在设备列表中找到“网络适配器”下的本地网卡(注意是有线网卡,网卡名在‘网络与Internet’中查看),右击本地网卡并选择“属性”,在弹出的对话框中选择“高级”页签,选择“Wake on Magic …”或“网络唤醒”选项并将其值设置为“开启”,在同一个窗口中选择“电源管理”页签,在“允许设备唤醒计算机”以及“只允许幻数据包唤醒计算机”选项前打钩
  3. 代码(需要被控制计算机的mac地址):

Lenovo系列电脑一般不支持网络唤醒功能

String mac = "";
   	  try {
           int port = 7;
           byte[] macByte = new byte[6];
           String[] ips = mac.split("\\:|\\-");
           for (int i = 0; i < 6; i++) {
               macByte[i] = (byte) Integer.parseInt(ips[i], 16);
           }
           // 用来存储网络唤醒数据包
           byte[] bys = new byte[6 + 16 * macByte.length];
           for (int i = 0; i < 6; i++) {
               bys[i] = (byte) 0xff;
           }
           for (int i = 6; i < bys.length; i += macByte.length) {
               System.arraycopy(macByte, 0, bys, i, macByte.length);
           }
           // 将字符形式的IP地址转换成标准的IP地址
           // InetAddress address = InetAddress.getByName(ip);
           InetAddress address = InetAddress.getByName("255.255.255.255");
           // 生成标准的数据报
           DatagramPacket pack = new DatagramPacket(bys, bys.length, address, port);
           // 创建标准套接字,用来发送数据报
           DatagramSocket socket = new DatagramSocket();
           // 发送魔法包
           socket.send(pack);
           socket.close();
       } catch (Exception e) {
           e.printStackTrace();
       } catch (Throwable e) {
           e.printStackTrace();
       }

远程关机

  1. 添加注册表
    ① 按Windows键+ R,输入:regedit,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
    ② 右击system 选择新建 DWORD(32位)值
    ③ 输入以下标签:LocalAccountTokenFilterPolicy
    ④ 双击该值,然后将该值更改为1
  2. 编辑本地组策略
    ① 按Windows键+ R,输入:gpedit.msc,打开“组策略编辑器”
    ② 在“组策略”窗口的左窗格中打开“计算机配置”—“Windows 设置”—“安全设置”—“本地策略”—“用户权利分配”
    ③ 在右侧列表中选择“从远程系统强制关机”,单击对话框下方的“添加用户或组”按钮,然后在新弹出的对话框中输入“guest”,再单击“确定”
    ④ 在右侧列表中选择“拒绝本地登录”,把拒绝的guest项删除
    ⑤ 在右侧列表中选择“拒绝从网络访问此计算机”,把拒绝的guest项删除
    ⑥ 在右侧列表中选择“允许本地登录”,单击对话框下方的“添加用户或组”按钮,然后在新弹出的对话框中输入“guest”,再单击“确定”
    ⑦ 在“组策略”窗口的左窗格中打开“计算机配置”—“Windows 设置”—“安全设置”—“本地策略”—“安全选项”
    ⑧ 在右侧列表中选择“帐户: 使用空密码的本地帐户只允许进行控制台登录”,选择禁用
    ⑨ 右键“此电脑”,选择“管理”,双击“本地用户和组”,双击其下的“用户”,然后双击“Guest”,若是显示账户已禁用,取消禁用
    ⑩ 运行cmd管理员权限,输入net user guest /active:yes激活guest账户
  3. 重启计算机
  4. 代码(需要被控制计算机的ip、用户名和密码)://用户名为‘guest’,密码可为空
String ip = "";
   	String user = "guest";
   	String pwd = "";
   	try {
   		Runtime.getRuntime().exec("net use * /del /y");
   		Process process = Runtime.getRuntime()
   				.exec("net use \\\\" + ip + "\\ipc$ \"" + pwd + "\" /user:\"" + user + "\"");
   		int i = process.waitFor();// 等待命令执行完
   		if (i == 0) {
   			Runtime.getRuntime().exec("shutdown -s -t 0 -m \\\\" + ip + " -c \"test\" -f");
   		}
   	} catch (Exception e) {
   		e.printStackTrace();
   	}
若是想要重启计算机,在关机的基础上修改参数s为r就可以了
    Runtime.getRuntime().exec("shutdown -r -t 0 -m \\\\" + ip + " -c \"test\" -f");