C# 执行bat文件 批处理 - 实现应用程序开机启动功能

最近在做一个项目(平台 .net 4.0 winform)的时候,客户要求软件能提供开机启动的设置选项

开始的时候,实现方法如下:

public class Boot
    {
        //写入注册表
        public static void bootFromBoot(string ExeName, string ExePath)
        {
            RegistryKey rKey = Registry.LocalMachine;
            RegistryKey autoRun = rKey.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

            try
            {
                autoRun.SetValue(ExeName, ExePath);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }

        //删除注册表
        public static void deleteFromBoot(string ExeName, string ExePath)
        {
            RegistryKey rKey = Registry.LocalMachine;
            RegistryKey autoRun = rKey.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

            try
            {
                //autoRun.DeleteValue(ExePath);
                if (autoRun.GetValue(ExeName) != null)
                    autoRun.DeleteValue(ExeName);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }

但是有个问题,应用程序没有管理员权限的时候,写入注册表会失败,在winform的项目属性里面打开了获取管理员权限

这回成功了,可以应用程序在win10系统上运行的时候,无法将桌面快捷方式拖进应用程序,报错,

找到原因是:取消管理员权限的时候,在win10上就能正常运行了,但是开机启动写入注册表就不行了,

脑袋瓜还是好使的(感谢上帝赐给的智慧),想到用windows的批处理文件进行注册表写入

#region bat批处理

        public static void CreateRegDeleteBat(string file_path, string key)
        {
            if (System.IO.File.Exists(file_path))
            {
                System.IO.File.Delete(file_path);
            }

            string bat = "@echo off" + "\r\n";
            bat += "cacls.exe \"%SystemDrive%\\System Volume Information\" >nul 2>nul" + "\r\n";
            bat += "if %errorlevel%==0 goto Admin" + "\r\n";
            bat += "echo request Administrator" + "\r\n";
            bat += "if exist \"%temp%\\getadmin.vbs\" del /f /q \"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "echo Set RequestUAC = CreateObject^(\"Shell.Application\"^)>\"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "echo RequestUAC.ShellExecute \"%~s0\",\"\",\"\",\"runas\",1 >>\"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "echo WScript.Quit >>\"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "\"%temp%\\getadmin.vbs\" /f" + "\r\n";
            bat += "if exist \"%temp%\\getadmin.vbs\" del /f /q \"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "exit" + "\r\n";

            bat += ":Admin" + "\r\n";
            bat += "echo delete reg" + "\r\n";
            bat += "reg delete \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v " + key + " /f" + "\r\n";

            //bat += "PAUSE";

            System.IO.File.WriteAllText(file_path, bat, Encoding.Default);
        }

        public static void CreateRegAddBat(string file_path, string key, string exeFullPath)
        {
            if (System.IO.File.Exists(file_path))
            {
                System.IO.File.Delete(file_path);
            }

            string bat = "@echo off" + "\r\n";
            bat += "cacls.exe \"%SystemDrive%\\System Volume Information\" >nul 2>nul" + "\r\n";
            bat += "if %errorlevel%==0 goto Admin" + "\r\n";
            bat += "echo request Administrator" + "\r\n";
            bat += "if exist \"%temp%\\getadmin.vbs\" del /f /q \"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "echo Set RequestUAC = CreateObject^(\"Shell.Application\"^)>\"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "echo RequestUAC.ShellExecute \"%~s0\",\"\",\"\",\"runas\",1 >>\"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "echo WScript.Quit >>\"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "\"%temp%\\getadmin.vbs\" /f" + "\r\n";
            bat += "if exist \"%temp%\\getadmin.vbs\" del /f /q \"%temp%\\getadmin.vbs\"" + "\r\n";
            bat += "exit" + "\r\n";

            bat += ":Admin" + "\r\n";
            bat += "echo add reg" + "\r\n";
            bat += "reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v " + key + " /d " + "\"" + exeFullPath + "\"" + " /f" + "\r\n";

            //bat += "PAUSE";

            System.IO.File.WriteAllText(file_path, bat, Encoding.Default);
        }

        public static void RunBATfile(string file_path, string file_name)
        {
            Process pro = new Process();
            pro.StartInfo.FileName = file_name;
            pro.StartInfo.WorkingDirectory = file_path;
            pro.StartInfo.CreateNoWindow = true;
            pro.Start();
            pro.WaitForExit();
        }

        #endregion

使用的时候这样:

private void reg_add()
        {
            string exe_path = Application.StartupPath;
            string file_name = "add_reg.bat";
            string full_path = exe_path + "\\" + file_name;

            string IconSyncPath = Application.ExecutablePath;

            FileHelper.CreateRegAddBat(full_path, "IconSync", IconSyncPath);
            FileHelper.RunBATfile(exe_path, file_name);
        }

        private void reg_delete()
        {
            string exe_path = Application.StartupPath;
            string file_name = "delete_reg.bat";
            string full_path = exe_path + "\\" + file_name;

            FileHelper.CreateRegDeleteBat(full_path, "IconSync");
            FileHelper.RunBATfile(exe_path, file_name);
        }

原文地址:https://www.cnblogs.com/craigtao/p/9218101.html

时间: 2024-10-13 00:59:42

C# 执行bat文件 批处理 - 实现应用程序开机启动功能的相关文章

win7计划任务执行BAT文件问题

今天下午做了一个调用java 可执行jar的程序,想通过win7的计划任务来调用 批处理命令: java -jar BIDropSyc.jar    或者 javaw -jar BIDropSyc.jar 但添加以后发现win7没有调用jar程序,单独点击批处理文件能执行.发现问题是由于没有添加批处理文件所在路径.在如下图框中添加上即可. win7计划任务执行BAT文件问题,布布扣,bubuko.com

ocx怎么得到classid,与动态执行 bat 文件

1.注册ocx控件: Regsvr32 [PATH]\xxx.ocx2.利用Regedit.exe注册表编辑器,在编辑器的查找里直接输入 .OCX文件名进行查找,找到:“HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxxxxxxxxxxxxxxxxxxxx}”主键后,再利用注册表编辑器菜单上-[注册表]-[导出注册表文件]-然后在文件选择窗里输入导出的注册表文件名 public sealed class COMUtils { /// <summary> /// 检查指定的 C

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令 http://www.cnblogs.com/ZHF/p/3328439.html WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是服务器系统会用到的一种组件.shell 就是“壳”的意思,这个对象可以执行操作系统外壳常用的操作,比如运行程序.读写注

C# 如何执行bat文件 传参数

C# 如何执行bat文件 传参数 分类: C# basic 2011-04-25 18:55 3972人阅读 评论(0) 收藏 举报 c#stringpathoutput [c-sharp] view plaincopy Process p = new Process(); string path = ...;//bat路径 ProcessStartInfo  pi= new ProcessStartInfo(path, ...);//第二个参数为传入的参数,string类型以空格分隔各个参数

使用java对执行命令行 或 执行bat文件

public class Hellotianhao { public static void main(String[] args) throws Exception{ System.out.println("hello tianhao"); Runtime.getRuntime().exec("cmd /k mkdir d:\\xutianhao"); } } 运行结果是在d盘新建了一个名为xutianhao的文件夹 java执行bat文件  bat文件书写注意在

CentOS设置程序开机启动程序/服务的方法(转)

注意:CentOS 6下基本没什么问题,CentOS 7估计不一定能行. 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. 1.把启动程序的命令添加到/etc/rc.d/rc.local文件中,比如下面的是设置开机启动httpd. #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in

C# Winform 注册程序开机启动

1 开机启动 public static bool SetAutoRun(string keyName, string filePath) { try { RegistryKey Local= Registry.LocalMachine; RegistryKey runKey =Local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"); runKey.SetValue(keyName, filePath)

Js使用WScript.Shell对象执行.bat文件和cmd命令

http://www.jb51.net/article/58669.htm WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是服务器系统会用到的一种组件.shell 就是“壳”的意思,这个对象可以执行操作系统外壳常用的操作,比如运行程序.读写注册表.环境变量等.这个对象通常被用在VB或VBS编程中. 安装WScript.Shell对象:

在android系统上写C语言程序--开机启动该程序不进入安卓系统

今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直接说实用的,怎么用这个东西. 关于这个问题,相信很多学Android的都会去关注这个问题,大家普遍会有个这样的疑问:安卓是怎么跑起来的? 最简单的说法,安卓系统是这样加载的: Bootloader------Kernel(对应平台版本的Linux内核)------filesystem文件系统(这个就