C#操作注册表,设置系统环境变量

C#操作注册表,设置系统环境变量


起因

最近重装系统,NX9.0太大了,不想重装,原来的话重装LicenceServer后,NX9.0是可以直接打开的,但是.NET二次开发的时候有错误,这次试一下添加注册表后,可不可以进行二次开发.  需要添加的

UGII_BASE_DIR

UGII_LANG

UGII_ROOT_DIR

D:\Program Files\Siemens\NX 9.0

UGII_LANG

D:\Program Files\Siemens\NX 9.0\UGII

因为懒得进[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]添加,也是为了以后方便打算,所以写了一个C#操作注册表的控制台程序.

代码

添加一个叫SysEnvironment的类,用来封装各个操作函数.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using System.Runtime.InteropServices;

namespace 设置系统环境变量
{
 class SysEnvironment
 {
 /// <summary>
 /// 获取系统环境变量
 /// </summary>
 /// <param name="name">输入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
 /// 下key的对应的字符串</param>
 /// <returns>Key对应的字符串</returns>
 public static string GetSysEnvironmentByName(string key)
 {
 string result = string.Empty;
 try
 {
                result = OpenSysEnvironment().GetValue(key).ToString();
 }
 catch (Exception)
 {

 return result;
 }
 return result;
 }

 /// <summary>
 /// 获得RegistryKey,值为
 /// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
 /// </summary>
 /// <returns></returns>
 public static RegistryKey OpenSysEnvironment()
 {
 RegistryKey regLocalMachine = Registry.LocalMachine;

 //打开HKEY_LOCAL_MACHINE下的SYSTEM,true表示具有写权限 
 //RegistryKey regSystem = regLocalMachine.OpenSubKey("System", true);
 //RegistryKey regControlSet = regSystem.OpenSubKey("CurrentControlSet", true).OpenSubKey("Control",true).OpenSubKey("Session Manager",true);
 RegistryKey regEnvironment = regLocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Session Manager\Environment", true);
 return regEnvironment;
 }

 /// <summary>
 /// 设置系统环境变量
 /// </summary>
 /// <param name="name">变量名</param>
 /// <param name="strValue">值</param>
 /// <param name="i">用来表示在路径首添加,还是在路径末尾添加</param>
 public static string SetSysEnvironment(string key, string strValue)
 {
 string pathList = null;

 if (CheckSysEnvironmentExist(key) == false)
 {
 //如果环境变量不存在,直接key-value添加就可
 OpenSysEnvironment().SetValue(key, strValue);
 return "已成功将所给key的环境变量设为value!";
 }
 else
 {
 //如果环境变量存在,需要首先检查value是否已经包含在key所对应的string中,
 //如果不包含在其中,就添加,否则,直接返回就可
                pathList = GetSysEnvironmentByName(key);
 if (pathList.Contains(strValue))
 {
 return "所给key的环境变量已包含value!";//已设置过,不用再次设置
 }
 if (!pathList.EndsWith(";"))
 {
 OpenSysEnvironment().SetValue(key, pathList + ";");
                    pathList = GetSysEnvironmentByName(key);
 }
 else
 {
 OpenSysEnvironment().SetValue(key, pathList + strValue);
 return "已成功在环境变量尾追加所给变量!";
 }
 }
 }

 /// <summary>
 /// 检测系统环境变量是否存在
 /// </summary>
 /// <param name="name">要修改path的Key</param>
 /// <returns></returns>
 public static Boolean CheckSysEnvironmentExist(string key)
 {
 if (!string.IsNullOrEmpty(GetSysEnvironmentByName(key)))
 {
 return true;
 }
 else
 {
 return false;
 }
 }
 }
}

Main函数里主要是读取输入的东西,并调用上述函数.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设置系统环境变量
{
 class Program
 {
 static void Main(string[] args)
 {
 Console.WriteLine(@"请输入您要输入的键值对,用空格分割,如 Path C:\Go");
 string keyValue = Console.ReadLine();
 while (keyValue != "z")
 {
 string[] result = keyValue.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries);
 string key = result[0];//这几行主要是处理输入路径中空格的情况,输入的是D:\Program Files\Siemens\NX 9.0\UGII,也不会因为空格而变成 D:\Program
 string value = keyValue.Trim().Remove(0, key.Length).Trim(' ');
 Console.WriteLine("key:{0} \t value:{1}", key, value);
 Console.WriteLine(SysEnvironment.SetSysEnvironment(key, value));
 Console.WriteLine("请输入下一键值对,按z加上回车结束程序");
                keyValue = Console.ReadLine();
 }
 Console.ReadKey();
 }
 }
}

参考博客:http://www.cnblogs.com/ITBread/archive/2012/04/15/2450367.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

不可或缺的 sendEmail

    还在为Linux下没有便捷的邮件程序苦恼,还在为复杂的邮件服务器架设Google N多网页? 对于小型,便捷的Linux下命令行邮件程序,sendEma...

9420
来自专栏飞扬的花生

C#实现Excel模板导出和从Excel导入数据

      午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 ? 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.O...

70070
来自专栏张高兴的博客

张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM

This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#.

21020
来自专栏Java成神之路

极光推送_总结_01_Java实现极光推送

19230
来自专栏木宛城主

两天完成一个小型工程报价系统(三层架构)

花了两天,整理了一下三层架构,顺便练了一个小型三层架构——工程报价系统。 功能很简单,完成基本的增删改查 搭建项目三层结构 ? 界面的设计以及美化 ...

36890
来自专栏大内老A

谈谈WCF中的Data Contract(4):WCF Data Contract Versioning

软件工程是一门独特的工程艺术,需要解决的是不断改变的需求变化。而对于WCF,对于SOA,由于涉及的是对多个系统之间的交互问题,如何有效地解决不断改变的需求所带来...

26250
来自专栏ASP.NET MVC5 后台权限管理系统

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页

前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信...

37970
来自专栏一个会写诗的程序员的博客

Spring Boot + JPA + Freemarker 实现后端分页 完整示例Spring Boot + JPA + Freemarker 实现后端分页 完整示例

https://github.com/EasyKotlin/chatper15_net_io_img_crawler

12720
来自专栏函数式编程语言及工具

Akka(29): Http:Server-Side-Api,Low-Level-Api

 Akka-http针对Connection的两头都提供了方便编程的Api,分别是Server-Side-Api和Client-Side-Api。通过这两个Ap...

22480
来自专栏张高兴的博客

张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM

15430

扫码关注云+社区

领取腾讯云代金券