old_flsystem/PCRobot/Utils/RegistryHelper.cs

210 lines
8.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
namespace PCRobot.Utils
{
public class RegistryHelper
{
static readonly IntPtr HKEY_CLASSES_ROOT = new IntPtr(unchecked((int)0x80000000));
static readonly IntPtr HKEY_CURRENT_USER = new IntPtr(unchecked((int)0x80000001));
static readonly IntPtr HKEY_LOCAL_MACHINE = new IntPtr(unchecked((int)0x80000002));
static readonly IntPtr HKEY_USERS = new IntPtr(unchecked((int)0x80000003));
static readonly IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(unchecked((int)0x80000004));
static readonly IntPtr HKEY_CURRENT_CONFIG = new IntPtr(unchecked((int)0x80000005));
static readonly IntPtr HKEY_DYN_DATA = new IntPtr(unchecked((int)0x80000006));
// 获取操作Key值句柄
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegOpenKeyEx(IntPtr hKey, string lpSubKey, uint ulOptions, int samDesired, out IntPtr phkResult);
//创建或打开Key值
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegCreateKeyEx(IntPtr hKey, string lpSubKey, int reserved, string type, int dwOptions, int REGSAM, IntPtr lpSecurityAttributes, out IntPtr phkResult,
out int lpdwDisposition);
//关闭注册表转向(禁用特定项的注册表反射)
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegDisableReflectionKey(IntPtr hKey);
//使能注册表转向(开启特定项的注册表反射)
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegEnableReflectionKey(IntPtr hKey);
//获取Key值Key值句柄所标志的Key对象的值
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegQueryValueEx(IntPtr hKey, string lpValueName, int lpReserved, out uint lpType, System.Text.StringBuilder lpData, ref uint lpcbData);
//设置Key值
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegSetValueEx(IntPtr hKey, string lpValueName, uint unReserved, uint unType, byte[] lpData, uint dataCount);
//关闭Key值
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegCloseKey(IntPtr hKey);
public static IntPtr TransferKeyName(string keyName)
{
IntPtr ret = IntPtr.Zero;
switch (keyName)
{
case "HKEY_CLASSES_ROOT":
ret = HKEY_CLASSES_ROOT;
break;
case "HKEY_CURRENT_USER":
ret = HKEY_CURRENT_USER;
break;
case "HKEY_LOCAL_MACHINE":
ret = HKEY_LOCAL_MACHINE;
break;
case "HKEY_USERS":
ret = HKEY_USERS;
break;
case "HKEY_PERFORMANCE_DATA":
ret = HKEY_PERFORMANCE_DATA;
break;
case "HKEY_CURRENT_CONFIG":
ret = HKEY_CURRENT_CONFIG;
break;
case "HKEY_DYN_DATA":
ret = HKEY_DYN_DATA;
break;
default:
ret = HKEY_LOCAL_MACHINE;
break;
}
return ret;
}
/// <summary>
/// 设置64位注册表
/// </summary>
/// <param name="key"></param>
/// <param name="subKey"></param>
/// <param name="name"></param>
/// <param name="value"></param>
/// <returns></returns>
public static int Set64BitRegistryKey(string key, string subKey, string name, string value)
{
int STANDARD_RIGHTS_ALL = (0x001F0000);
int KEY_QUERY_VALUE = (0x0001);
int KEY_SET_VALUE = (0x0002);
int KEY_CREATE_SUB_KEY = (0x0004);
int KEY_ENUMERATE_SUB_KEYS = (0x0008);
int KEY_NOTIFY = (0x0010);
int KEY_CREATE_LINK = (0x0020);
int SYNCHRONIZE = (0x00100000);
int KEY_WOW64_64KEY = (0x0100);
int REG_OPTION_NON_VOLATILE = (0x00000000);
int KEY_ALL_ACCESS = (STANDARD_RIGHTS_ALL | KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS
| KEY_NOTIFY | KEY_CREATE_LINK) & (~SYNCHRONIZE);
int ret = 0;
try
{
//将Windows注册表主键名转化成为不带正负号的整形句柄与平台是32或者64位有关
IntPtr hKey = TransferKeyName(key);
//声明将要获取Key值的句柄
IntPtr pHKey = IntPtr.Zero;
//获得操作Key值的句柄
int lpdwDisposition = 0;
ret = RegCreateKeyEx(hKey, subKey, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_WOW64_64KEY, IntPtr.Zero, out pHKey, out lpdwDisposition);
if (ret != 0)
{
//Console.WriteLine(string.Format("Unable to create key {0} - {1}: {2}!", key, subKey, ret));
return ret;
}
//关闭注册表转向(禁止特定项的注册表反射)
RegDisableReflectionKey(pHKey);
//设置访问的Key值
uint REG_SZ = 1;
byte[] data = Encoding.Unicode.GetBytes(value);
RegSetValueEx(pHKey, name, 0, REG_SZ, data, (uint)data.Length);
//打开注册表转向(开启特定项的注册表反射)
RegEnableReflectionKey(pHKey);
RegCloseKey(pHKey);
}
catch (Exception ex)
{
//Console.WriteLine(ex.ToString());
return -1;
}
return ret;
}
public static void SetRegistryKey(string key, string subKey, string name, string value)
{
//Console.WriteLine("SetRegistryKey start.");
if (System.IntPtr.Size == 8)
{
// 写SOFTWARE\Huawei\VirtualDesktopAgent需要关闭注册表重定向再写64位路径的注册表
int ret = Set64BitRegistryKey(key, subKey, name, value);
if (ret != 0)
{
Console.WriteLine(string.Format("Failed to write Reg {0}\\{1}\\{2},return {3}", key, subKey, name, ret));
}
}
try
{
Microsoft.Win32.Registry.SetValue(key + "\\" + subKey, name, value);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
//Console.WriteLine("SetRegistryKey exit.");
}
public static string GetRegistryValue(string path, string key)
{
RegistryKey regkey = null;
try
{
regkey = Registry.LocalMachine.OpenSubKey(path);
if (regkey == null)
{
//Console.WriteLine("Cannot find Registry path:" + path);
return null;
}
object val = regkey.GetValue(key);
if (val == null)
{
//Console.WriteLine("Cannot find Registry key:" + key);
return null;
}
return val.ToString();
}
catch (Exception ex)
{
//Console.WriteLine(ex.ToString());
return null;
}
finally
{
if (regkey != null)
{
regkey.Close();
}
}
}
}
}