old_flsystem/PCRobot/Utils/RegistryHelper.cs

210 lines
8.1 KiB
C#
Raw Permalink Normal View History

2022-09-20 03:10:29 +00:00
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();
}
}
}
}
}