C#实现Windows开机自启动
Windows开机自启动的API原理是向注册表
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
对应应用程序的运行路径,或者说启动命令,允许带参数。
HKEY_CURRENT_USER与HKEY_LOCAL_MACHINE
注册表HKEY_CURRENT_USER节点下的内容仅针对当前登录的用户生效,Windows是多账户系统(不是多用户系统,多用户允许同时多个用户登录使用当前计算机系统),不同账户下有不同的配置。
注册表HKEY_LOCAL_MACHINE节点下的内容都是针对系统所有用户生效的。
C#可以直接调用Windows API接口读写注册表
第一、实现写注册表的函数
private static bool WriteRegistryValue(RegistryKey regKey, String keyName, String value)
{if (null == keyName || 0 == keyName.Trim().Length){Console.WriteLine("WriteRegistryValue, invalid keyName: " + keyName);return false;}if (null == value || 0 == value.Trim().Length){Console.WriteLine("WriteRegistryValue, invalid value: " + value);return false;}try{bool needChange = false;String[] names = regKey.GetValueNames();if (null != names){for (int i = 0; i < names.Length; i++){String oldValue = (String)regKey.GetValue(keyName, "");if (null == oldValue || !oldValue.Equals(value)){needChange = true;break;}}}if (needChange){regKey.SetValue(keyName, value);}return true;}catch (SecurityException e){Console.WriteLine("WriteRegistryValue, SecurityException ");}catch (ObjectDisposedException e){Console.WriteLine("WriteRegistryValue, ObjectDisposedException");}catch (System.IO.IOException e){Console.WriteLine("WriteRegistryValue, IOException");}catch (UnauthorizedAccessException e){Console.WriteLine("WriteRegistryValue, IOException");}return false;
}
第二、实现向注册表节点Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run写入数值的函数
public static String getAutoStartKeyName(String softwareName, String softwarePath)
{if (null == softwareName || 0 == softwareName.Trim().Length){return "";}if (null == softwarePath || 0 == softwarePath.Trim().Length){return "";}String md5sum = Md5sum(softwarePath);return softwareName + "_" + md5sum.Substring(0, 8);
}public static bool setAutoStart(String softwareName, String softwarePath)
{if (null == softwareName || 0 == softwareName.Trim().Length){Console.WriteLine("invalid softwareName: " + softwareName);return false;}if (null == softwarePath || 0 == softwarePath.Trim().Length){Console.WriteLine("invalid softwarePath: " + softwarePath);return false;}RegistryKey localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);RegistryKey regKeyRun = localMachineKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);RegistryKey regKeySoftware = null, regKeyMiscrosoft = null, regKeyWindows = null, regKeyCurrentVersion = null;try{if (null == regKeyRun){Console.WriteLine("openSubKey failed. try create it.");regKeySoftware = localMachineKey.CreateSubKey("Software");regKeyMiscrosoft = regKeySoftware.CreateSubKey("Microsoft");regKeyWindows = regKeyMiscrosoft.CreateSubKey("Windows");regKeyCurrentVersion = regKeyWindows.CreateSubKey("CurrentVersion");regKeyRun = regKeyCurrentVersion.CreateSubKey("Run");}String keyName = getAutoStartKeyName(softwareName, softwarePath);return WriteRegistryValue(regKeyRun, keyName, softwarePath);}finally{SafeCloseRegKey(regKeyRun); regKeyRun = null;SafeCloseRegKey(regKeyCurrentVersion); regKeyCurrentVersion = null;SafeCloseRegKey(regKeyWindows); regKeyWindows = null;SafeCloseRegKey(regKeyMiscrosoft); regKeyMiscrosoft = null;SafeCloseRegKey(regKeySoftware); regKeySoftware = null;}
}private static void SafeCloseRegKey(RegistryKey regKey)
{if (null != regKey){regKey.Close();}
}public static String Md5sum(String input)
{// step 1, calculate MD5 hash from inputSystem.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);byte[] hash = md5.ComputeHash(inputBytes);// step 2, convert byte array to hex stringStringBuilder sb = new StringBuilder();for (int i = 0; i < hash.Length; i++){sb.Append(hash[i].ToString("X2"));}return sb.ToString();
}
大家注意到String getAutoStartKeyName(String softwareName, String softwarePath)函数,这里是为了防止注册表中的name存在相同的情况造成冲突,因此将程序路劲也放进去MD5计算生成唯一的name保证不会冲突。
第三、实现关闭自启动
其实就是将自启动信息从注册表中删除
public static bool RemoveAutoStart(String softwarePath)
{if (null == softwarePath || 0 == softwarePath.Trim().Length){return false;}RegistryKey localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);RegistryKey regKeyRun = localMachineKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);if (null == regKeyRun){return false;}try{String[] names = regKeyRun.GetValueNames();if (null == names || 0 == names.Length){return false;}String value;foreach (String name in names){value = (String)regKeyRun.GetValue(name, "");if (softwarePath.Equals(value)){regKeyRun.DeleteValue(name);return true;}}}catch (SecurityException e){Console.WriteLine("SecurityException");}catch (ObjectDisposedException e){Console.WriteLine("ObjectDisposedException");}catch (System.IO.IOException e){Console.WriteLine("IOException");}catch (UnauthorizedAccessException e){Console.WriteLine("IOException");}finally{SafeCloseRegKey(regKeyRun); regKeyRun = null;}return false; // TODO
}
第四、实现判断当前路径是否有自启动的方法
因为在本人工具中只设置当前用户的自启动,所以判断时只判断当前用户,如果需要所有用户请使用HKEY_LOCAL_MACHINE对应的参数
public static bool IsAutoStart(String softwarePath)
{if (null == softwarePath || 0 == softwarePath.Trim().Length){return false;}RegistryKey localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);RegistryKey regKeyRun = localMachineKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);if (null == regKeyRun){return false;}try{String[] names = regKeyRun.GetValueNames();if (null == names || 0 == names.Length){return false;}String value;foreach (String name in names){value = (String)regKeyRun.GetValue(name, "");if (softwarePath.Equals(value)){return true;}}}catch (SecurityException e){Console.WriteLine("SecurityException");}catch (ObjectDisposedException e){Console.WriteLine("ObjectDisposedException");}catch (System.IO.IOException e){Console.WriteLine("IOException");}catch (UnauthorizedAccessException e){Console.WriteLine("IOException");}finally{SafeCloseRegKey(regKeyRun); regKeyRun = null;}return false;
}
因为小工具是自己使用的,所以没有考虑到全局用户,全局用户需要administrator权限,大家用VS编译时增加对应权限就可以了。
C#实现Windows开机自启动相关推荐
- html 启动bat脚本,Windows开机自启动bat脚本设置方法
摘要 腾兴网为您分享:Windows开机自启动bat脚本设置方法,小睡眠,小书亭,托迈酷客,土豆等软件知识,以及显卡加亮,团购宝,多和梦,pdf编辑器,杭州地铁线路图,宝宝拼图游戏,蠕虫病毒专杀工具, ...
- Windows开机自启动jar包
在Windows环境设置开机自启动jar包的核心思想就是把启动命令注册成一个服务,然后就可以设置开机自启动了.手写一个注册服务代码比较麻烦,可以借助线程的exe可执行文件来做. 首先去https:// ...
- windows开机自启动jar包的三种方式
方式一.利用组策略,后台静默运行 1.编写运行运行jar包脚本的脚本,如 @echo off start /d "D:\visitor-services\" startup.bat ...
- windows 开机自启动设置 注册表修改
开始菜单-运行命令-输入regedit回车打开注册表编辑器. 依次展开:HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows->Cu ...
- PyQt5随笔:PyQt5 程序在开机自启动时读取文件出错导致崩溃解决办法
PyQt5随笔:PyQt5 程序在开机自启动时读取文件出错导致崩溃解决办法 1.前言 最近在写一个 Python+pyqt5 小项目,在改善过程中想添加一个日志记录,我是打算用txt 文件记录就好,操 ...
- Windows设置软件开机自启动与关闭
Windows设置软件开机自启动 有时候我们需要手动为某些软件设置开机自启动权限,或者手动取消软件开机自启动权限. 取消开机自启动权限: 1. Win+R,在打开的运行程序中输入 msconfig,回 ...
- Windows下怎样使用bat设置Redis和Nginx开机自启动
场景 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/d ...
- 【Windows工具】QuickLook-3.6.11 安装并设置开机自启动(含较难下载的 QuickLook-3.6.11 安装包百度云盘资源)
1.QuickLook资源链接: https://pan.baidu.com/s/1netQwuSIaYGFatpjLAIYxw 提取码:fcle 2.设置开机自启动 设置开机自启动的方法很多,这里分 ...
- java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)
WINDOWS: 1.新建一个text文件,将 java -jar D:\eclipse-workspace\attendance\target\mybatis-generator.jar写入,修改文 ...
- EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务
本文转自EasyDarwin开源团队成员Penggy的博客:http://www.jianshu.com/p/ef840505ae06 近期在EasyDarwin开源团队开发一款基于EasyDarwi ...
最新文章
- 关机时 ,提示其他用户登录到这台计算机,关闭WINDOWS会使他们丢失数据
- Spark DataFrame 添加自增id
- SQL Server 查看identity值的几种方法。
- Android自定义View实现滴滴验证码输入框效果
- 2021努力拼搏,致敬为梦想而拼搏的人
- 面经——嵌入式软件工程师面试遇到的经典题目
- linux系统下RocketMQ的集群搭建
- android 开发对gif解码(适配android 4.2、4.3、4.4版本)
- 感谢所有常来我博客的朋友
- tif怎么转化为jpg_tif怎么批量转换成jpg
- 东京中文离线地图App上线
- 计算机网络回顾之计算机网络概述
- linux 软链接 相对路径,Linux入门之ln命令创建软链接的绝对路径和相对路径详解(Ubuntu)...
- 你永远穷不过一个广东人
- 2020年平时使用的资源网站
- Kaldi-Timit 训练
- 《余光中诗歌精读》放下代码,静下心来,细细品读
- 用tensorflow.js实现浏览器内的手写数字识别
- Leetcode 碎碎念
- Xcode 4.5 支持 amv6
热门文章
- 能力提升综合题单Part 8.1 图的存储与遍历
- 刷题记录 CF每日一题打卡 2020.6月7-6月13
- qt 展开指定目录_Qt5实战003:Qt Creator工程目录浅析
- svg动画导致持续占用CPU
- nginx简单的rewrite配置
- IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
- 基于raphael 的图形变化
- SpringCloud之Ribbon源码分析(一)
- RabbitMQ的工作模式及消息顺序性的保证
- Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配