前言:
公司某个系统,每次安装后需要手动设置各种权限、路径、环境变量等等!公司网络环境为不开放管理员权限,所以每次安装该系统后,几个操作会占用大量时间!所以决定改成直接软件点击操作!涉及的知识点如下:
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、学会变通,不要死脑筋,效率自动提高!

还没有评论,来说两句吧...