前言
由于疫情的持续肆虐,出行成了大问题。为了尽量减少风险,外地的办公室是能不过去就不过去。一般问题远程就解决了,但碰到系统因故障需重装的情况就比较麻烦,外地的同事并不是IT专业的,在电话指导+Word文档指引下安装完系统,后续仍有一些重复的操作如开启远程桌面、设置默认账号密码及变更防火墙设置(以放开远程桌面连接)等,虽亦可以写份Word文档说明操作步骤,但总感觉这些操作可以通过程序来实现,同时考虑到在远程桌面开通后,仍有一些标准的安全设置需要重复设置,遂用C#写了两个小工具来自动化这些操作。其中主要用到以下这些功能,分享一下。
Console应用程序(Net40):运行Powershell脚本(以实现:开通远程桌面、设置本机用户密码)及显示本机IP地址。用于在系统初始安装完成后运行取得远程控制权。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
namespace SetSystemInit
{
class Program
{
[DllImport("User32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr h, string m, string c, int type);
static void Main(string[] args)
{
SetupViaPowerShell();
MessageBox((IntPtr)0, GetAllLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault(), "本机 IP 地址", 0);
}
public static void SetupViaPowerShell()
{
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
var directory = System.IO.Path.GetDirectoryName(path);
// Powershell脚本和可执行文件在同一目录下
var ps1File = directory + "\\PowershellCMD.ps1";
var startInfo = new ProcessStartInfo()
{
FileName = "powershell.exe",
Arguments = $"-NoProfile -ExecutionPolicy unrestricted -File \"{ps1File}\"",
UseShellExecute = false
};
Process.Start(startInfo);
}
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
}
}
PowershellCMD.ps1脚本如下:
#开通RDP
(Get-WmiObject Win32_TerminalServiceSetting -Namespace root\cimv2\TerminalServices).SetAllowTsConnections(1,1) | Out-Null
#取消NLA认证
(Get-WmiObject -Class "Win32_TSGeneralSetting" -Namespace root\cimv2\TerminalServices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(0) | Out-Null
#定义允许的IP地址范围
$ips = @("192.168.11.248","192.168.10.248")
#开通Ping
New-NetFirewallRule -DisplayName "Allow inbound ICMPv4" -Direction Inbound -Protocol ICMPv4 -IcmpType 8 -RemoteAddress $ips -Action Allow
#添加自定义RDP规则
New-NetFirewallRule -DisplayName "AllowRDP" -Direction Inbound -Protocol TCP –LocalPort 3389 -RemoteAddress $ips -Action Allow
#用户名在安装过程中指定(空密码)
Set-LocalUser -Name 本机用户名 -Password (ConvertTo-SecureString "设置的密码" -AsPlainText -Force)
使用
注意:Win7系统须先安装NET40(由于新装系统基本上是Win10,并且安装NET40也非常简单,故未测试NET2.1)
编译后的可行程序和Powershell脚本放在U盘中相同目录下,以管理员身份运行可执行,最后会显示本机(通过DHCP获得)的IP地址,外地协助的同事只需要将IP告知(其实可以先记录下目标机器的MAC,然后也亦通过例如Advanced IP Scanner之类的工具反查到IP),即可通过该IP远程RDP至新装的系统进行后续的设置及安装等操作。
版权声明:本文为Sunny_Clickman原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。