首页 > 代码库 > 近两周工作总结
近两周工作总结
这项目终于要完了, 由于某国家部门的服务器安装配置过程过于繁杂, 系统使用镜像还原再修改配置的方法进行部署;
本文内代码遵循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");
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:\Users\RainierW\Desktop\管理控制台.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();
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. 注意引号数量以及各种语言的特殊字符;
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");
1 sele disk 0 2 sele part 0 3 exte 4 sele part 1 5 exte 6 sele disk 1 7 sele part 0 8 exte 9 sele part 110 exte11 exit
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}\r\n{1}\r\n{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 }
其中: 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;
近两周工作总结