本文作者:每日一学网站长

记一次C#语言下winfrom的简单开发,文件夹权限,环境变量设置等

每日一学网站长 10个月前 ( 06-07 ) 抢沙发

前言:

公司某个系统,每次安装后需要手动设置各种权限、路径、环境变量等等!公司网络环境为不开放管理员权限,所以每次安装该系统后,几个操作会占用大量时间!所以决定改成直接软件点击操作!涉及的知识点如下:


1、C#对windows文件系统IO,复制,重命名,删除等的操作!

2、C#对文件夹安全性的操作!

3、C#对windows系统环境变量的操作!


整个程序耗时两小时左右,其中1个小时构思如何写以及前两项的代码编写,另外一个小时就是系统环境变量的操作耗时耗力,最后还是靠我的聪明才智解决了!


下面是软件的编写流程及部分代码!

先来个效果图吧!


软件首次打开弹出提示框:


image.png


代码:

public Form1()
        {
            InitializeComponent();
            MessageBox.Show("一:首先點擊安裝MES,選擇非C盤路徑,且路徑不含(X86),地區選擇蕪湖,安裝完成后不要重啟電腦!\r二:點擊選擇MES路徑 \r三:按順序點擊第一步,第二步。。。 \r四:所有步驟完成后,請重啟計算機", "首次安裝提示");
        }


点击确定后进入软件主页面:

image.png



点击安装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、学会变通,不要死脑筋,效率自动提高!


文章版权及转载声明

作者:每日一学网站长本文地址:https://www.meiriyixue.cn/post/711.html发布于 10个月前 ( 06-07 )
文章转载或复制请以超链接形式并注明出处每日一学网

分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,人围观)参与讨论

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