近两周工作总结

这项目终于要完了, 由于某国家部门的服务器安装配置过程过于繁杂, 系统使用镜像还原再修改配置的方法进行部署;

本文内代码遵循WTFPL协议,转载请注明来源: http://www.cnblogs.com/zaiyuzhong/p/3935155.html 

1. 停止/禁用服务

 1 var p = new Process();
 2 p.StartInfo = new ProcessStartInfo("cmd.exe")
 3 {
 4     UseShellExecute = false,
 5     CreateNoWindow = true,
 6     RedirectStandardInput = true
 7 };
 8 p.Start();
 9 InvokeChangeText("停止IBMWebSphere服务...");
10 p.StandardInput.WriteLine(" sc stop IBMWebSphere");
调用cmd命令sc实现

 Note: i. 禁用加一句 p.StandardInput.WriteLine(" sc config 服务名 start=Disable");

    ii. 不知道怎么得cmd窗口每行第一个字符总是乱码, 所以加了空格;

    iii. 如有多个(停止XX相关服务), 需循环遍历System.ServiceProcess.ServiceController.GetServices()/*好像要添加引用*/返回的集合, 根据元素的ServiceName属性判断服务名后再停止/禁用;

2. 修改机器名

 1 var key = Registry.LocalMachine;
 2 using (var activeComputerName = key.CreateSubKey("SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName"))
 3     activeComputerName.SetValue("ComputerName", 新机器名);
 4 using (var computerName = key.CreateSubKey("SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName"))
 5     computerName.SetValue("ComputerName", 新机器名);
 6 using (var hostName = key.CreateSubKey("SYSTEM\CurrentControlSet\services\Tcpip\Parameters\"))
 7 {
 8     hostName.SetValue("Hostname", 新机器名);
 9     hostName.SetValue("NV Hostname", 新机器名);
10 }
修改注册表 重启后生效

 Note: i. 主要使用Microsoft.Win32.Registry类, 其中有7个静态字段, 对应注册表的基项;

    ii. 也可以调用RegistryKey类的OpenSubKey方法找到键, 但要注意给写权限;

3. 修改注册表 (见2, 这个有点充数了抱歉)

4. 修改快捷方式目标

 这个有两种方法, 其中通过IWshShortcut测试后没什么效果, 不知道我调用错了还是怎么滴;

a. IWshSortcut

 Note: i. 需要引用COM中的Windows Script Host Object Model;

    ii. TargetPath属性不要含有文件名不能使用的字符, 否则会引发ArgumentException;

    iii. 目标中如需添加参数请赋值给Arguments属性;          

1 var wshShell = new WshShell();
2 var shortcut = default(IWshShortcut);
3 shortcut = (IWshShortcut)wshShell.CreateShortcut(@"C:UsersRainierWDesktop管理控制台.lnk");
4 shortcut.TargetPath = "%windir%\system32\cmd.exe";
5 shortcut.Arguments = " /c start /b http://127.0.0.1:9060/ibm/console";
6 shortcut.Save();
IWshSortcut

b. 还是cmd命令, 调用代码见1;

 cmd命令:"mshta VBScript:Execute("Set a=CreateObject(""WScript.Shell""):Set b=a.CreateShortcut(""lnk文件FullName""):b.Arguments=(""目标参数""):b.TargetPath=(""目标FullName""):b.Save:close") ";

 Note: i. 注意引号数量以及各种语言的特殊字符;

    ii. 测试过程中发现在C#中直接写入输入流的方式有问题总是乱码(可能是未使用Shell执行VBScript导致的), 改为由cmd调用外部bat文件实现

5. 重命名文件夹

 感觉我的方法不怎么样: 由DirectoryInfo对象获得文件夹名, string替换得到新文件夹名, 新建文件夹, 原有文件夹下所有内容Move到新文件夹, 删除原文件夹; 望赐教;

6. 扩展磁盘空间为最大

 因为是用镜像恢复的嘛, 磁盘有大有小, 恢复完要扩展磁盘空间;

 1 var p = new Process();
 2 p.StartInfo = new ProcessStartInfo("cmd.exe")
 3 {
 4     UseShellExecute = false,
 5     CreateNoWindow = true,
 6     RedirectStandardInput = true,
 7     Arguments = "diskpart /s ExtendDisk.txt"
 8 };
 9 p.Start();
10 p.StandardInput.WriteLine("exit");
cmd命令diskpart调用外部命令
 1 sele disk 0
 2 sele part 1
 3 exte
 4 sele part 2
 5 exte
 6 sele disk 1
 7 sele part 1
 8 exte
 9 sele part 2
10 exte
11 exit
ExtendDisk.txt

后续测试过程中发现这种一次执行的脚本文件如果遇到一个bug就停止执行了, 所以改为一个脚本文件扩展一个分区, 像这次这样的需要四个脚本文件. (感觉怪怪的)

7. 修改网卡配置

这个东西弄了三四天, 首先检查是否有可用网卡, 没有提示, 有一个修改这一个, 多于一个显示网卡信息让用户来选; 而显示网卡信息需要尽量像Windows的更改适配器页面;

 a. 判断是否有可用网卡调用NetworkInterface.GetIsNetworkAvailable()

 b. 通过ManagementClass获得网卡信息(其实不止网卡, CPU什么的信息也能从这个类获得), 需要添加System.Management引用;

 c. 因为又要显示NetConnectionID又要显示IPAddress还要显示Name... 先看代码吧

 1 var adapters = new ManagementClass("Win32_NetworkAdapterConfiguration").GetInstances();
 2 foreach (ManagementObject a in adapters)
 3 {
 4     if (!(bool)a["IPEnabled"]) continue;
 5     _adapters.Add((uint)a["Index"], a);
 6 }
 7 
 8 if (_adapters.Count <= 1) return;
 9 
10 var moc = new ManagementClass("Win32_NetworkAdapter").GetInstances();
11 foreach (ManagementObject mo in moc)
12 {
13     if (!(bool)mo["PhysicalAdapter"]) continue;
14     var ip = string.Empty;
15     uint i;
16     if (uint.TryParse((string)mo["DeviceID"], out i) && _adapters.ContainsKey(i))
17         ip = ((string[])(_adapters[i]["IPAddress"]))[0];
18     var r = new RadioButton() { AutoSize = true, Tag = mo };
19     r.Text = string.Format("{0}
{1}
{2}", mo["NetConnectionID"], ip, SubstringName(mo["Name"]));
20     r.CheckedChanged += new EventHandler((object sender, EventArgs e) =>
21     {
22         var radio = sender as RadioButton;
23         if (!radio.Checked) return;
24         if (MessageBox.Show("这次操作会覆盖该网卡的网络配置,确定修改吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) return;
25         InvokeChangeFlpEnabledVisible(false, true);
26         this.Cursor = Cursors.WaitCursor;
27         ChangeAdapter((ManagementObject)radio.Tag, _address, _subnetMask, _gateway);
28         InvokeChangeFlpEnabledVisible(false, false);
29     });
30     this.flowLayoutPanel1.Controls.Add(r);
31 }
View Code

  其中: ManagementClass("Win32_NetworkAdapterConfiguration").GetInstances()获取到的实例不包括NetConnectionID和Name, 有Name和Index(后面说这个属性); 而ManagementClass("Win32_NetworkAdapter").GetInstances()获取到的实例没有IPAddress, 有NetConnectionID, Name和DeviceID;

 我发现Index和DeviceID是相同的, So...

最后. 重启计算机

 这个好说, System.Diagnostics.Process.Start("shutdown", @"/r /t 0 /d p:1:4"); 第二个参数是命令所需参数, 具体代表嘛意思问cmd吧;

原文地址:https://www.cnblogs.com/zaiyuzhong/p/3935155.html