• 近两周工作总结


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

    本文内代码遵循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吧;

  • 相关阅读:
    [CTF]ROT5/13/18/47位移密码
    [CTF]维吉尼亚密码(维基利亚密码)
    [CTF]ACSII码
    kxtj2-1009驱动总结
    DC/DCLT1767EMS8E-5芯片
    485通信总结
    安装pymssql报错
    安装mysqlclient报错
    ERROR 1878
    Win10安装gopls
  • 原文地址:https://www.cnblogs.com/zaiyuzhong/p/3935155.html
Copyright © 2020-2023  润新知