前言:
公司某个系统,每次安装后需要手动设置各种权限、路径、环境变量等等!公司网络环境为不开放管理员权限,所以每次安装该系统后,几个操作会占用大量时间!所以决定改成直接软件点击操作!涉及的知识点如下:
1、C#对windows文件系统IO,复制,重命名,删除等的操作!
2、C#对文件夹安全性的操作!
3、C#对windows系统环境变量的操作!
整个程序耗时两小时左右,其中1个小时构思如何写以及前两项的代码编写,另外一个小时就是系统环境变量的操作耗时耗力,最后还是靠我的聪明才智解决了!
下面是软件的编写流程及部分代码!
先来个效果图吧!
软件首次打开弹出提示框:
代码:
public Form1() { InitializeComponent(); MessageBox.Show("一:首先點擊安裝MES,選擇非C盤路徑,且路徑不含(X86),地區選擇蕪湖,安裝完成后不要重啟電腦!\r二:點擊選擇MES路徑 \r三:按順序點擊第一步,第二步。。。 \r四:所有步驟完成后,請重啟計算機", "首次安裝提示"); }
点击确定后进入软件主页面:
点击安装MES,使用管理员权限运行服务器上面的安装包
代码如下:
private void 安装mesToolStripMenuItem_Click(object sender, EventArgs e) { try { string dz = "\\\\192.168.10.1\\***.exe";//自己选择地址吧 FileInfo dzfile = new FileInfo(dz); if (dzfile.Exists) { //Process.Start(dz); System.Diagnostics.Process.Start(dz); } else { MessageBox.Show("未找到安装文件,請与管理员確認路徑是否正確及文件是否存在。"); return; } } catch (Exception ex){ MessageBox.Show(ex.Message,"錯誤提示"); } } }
选择MES路径,这个功能调用folderBrowserDialog控件,获取到文件夹的路径,返回值放到文本框1里面
代码如下:
private void button1_Click(object sender, EventArgs e) { System.Windows.Forms.FolderBrowserDialog folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); System.Windows.Forms.DialogResult result = folderBrowserDialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) { this.textBox1.Text = folderBrowserDialog.SelectedPath; } }
第一步执行upgrade就是获取文本框1的路径,定位到软件安装目录,执行安装目录下的upgrade.bat
代码如下:
if (textBox1.Text == "") { MessageBox.Show("請先選擇路徑", "提示"); return; } string dz = textBox1.Text + "\\upgrade.bat"; FileInfo dzfile = new FileInfo(dz); if (dzfile.Exists) { Process.Start(dz); } else { MessageBox.Show("未找到upgrade.bat,請確認路徑是否正確及文件是否存在。", "提示"); textBox1.Text = ""; return; }
第二步修改DLL,功能是将安装目录下的**.dll1命名为**.dll,并将原**.dll删除
代码如下:
if (textBox1.Text == "") { MessageBox.Show("請先選擇路徑", "提示"); return; } string old = textBox1.Text + "\\DLL\\login_SFIS.dll";//原文件 string old_new= textBox1.Text + "\\DLL\\login_SFIS.dll2";//改后的文件名 FileInfo file = new FileInfo(old); FileInfo file2 = new FileInfo(old_new); if (file2.Exists) { MessageBox.Show("您已執行過該步驟,請勿重複執行", "提示"); return; } if (file.Exists)//判斷文件是否存在,返回錯誤值 { System.IO.File.Copy(old, old_new); System.IO.File.Delete(old); } else { MessageBox.Show("未找到login_sfis.dll,請選擇正確路徑且確認文件是否存在", "提示"); textBox1.Text = ""; return; } string NEW= textBox1.Text + "\\DLL\\login_SFIS.dll1"; string NEW_old = textBox1.Text+"\\DLL\\login_SFIS.dll"; System.IO.File.Copy(NEW,NEW_old); System.IO.File.Delete(NEW); MessageBox.Show("處理完畢", "提示");
第三步 修改安全性,就是修改安装目录的安全性,添加上user和everyone的所有权限,代码不会写,百度到了一段可行操作
代码如下:
string dz = textBox1.Text; if (dz == "") { MessageBox.Show("請先選擇路徑", "提示"); return; } try { DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(dz)); //获得路径 System.Security.AccessControl.DirectorySecurity dirSecurity = di.GetAccessControl(AccessControlSections.All); //获得该文件夹的所有访问权限 //设定文件ACL继承 InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); bool isModified = false; dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified); dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified); //设置访问权限 di.SetAccessControl(dirSecurity); MessageBox.Show("修改完成", "提示"); } catch (Exception ex) { MessageBox.Show(ex.Message); } //try下面代碼異常全部拋出
第四步 拷贝文件,将安装目录下的某个文件拷贝到C盘一个路径下面!代码同第二步,不赘述
第五步 修改环境变量 花费我时间最多的一步,因为一开始总是想用,点击按钮打开环境变量设置面板的方式,但是实现不了,后来又换成执行批处理,用批处理修改环境变量,还是不好用,一气之下,加了两个文本框和一个label控件,将所有路径全部打印出来,然后再获取返回值,发现可以了,也懒得写进内存啥的了,直接给几个空间设置为不可见,反正小软件,没啥要求,没有bug就行!
代码如下:
try { if (textBox1.Text == "") { MessageBox.Show("請先選擇路徑", "提示"); return; } string regdz = textBox1.Text + "\\oracle\\product\\10.2.0\\client_1\\BIN;"; label1.Text = regdz; RegistryKey regLocalMachine = Registry.LocalMachine; RegistryKey regSYSTEM = regLocalMachine.OpenSubKey("SYSTEM", true);//打开HKEY_LOCAL_MACHINE下的SYSTEM RegistryKey regControlSet001 = regSYSTEM.OpenSubKey("ControlSet001", true);//打开ControlSet001 RegistryKey regControl = regControlSet001.OpenSubKey("Control", true);//打开Control RegistryKey regManager = regControl.OpenSubKey("Session Manager", true);//打开Control RegistryKey regEnvironment = regManager.OpenSubKey("Environment", true);//打开MSSQLServer下的MSSQLServer this.textBox2.Text = regEnvironment.GetValue("path").ToString();//读取path的值 string Str = textBox2.Text.Replace(regdz, ""); textBox3.Text = Str; regEnvironment.SetValue("path", this.textBox3.Text);//设置path的值 MessageBox.Show("已全部修改完成,請重啟電腦"); } catch (Exception ex) { MessageBox.Show(ex.Message, "提示"); }
最后一个重启计算机,没啥好说的,不贴代码了!
总结
1、善用try{}catch{},总有意外发生时,让你第一时间知道是啥回事!
2、学会变通,不要死脑筋,效率自动提高!
还没有评论,来说两句吧...