如何取得注册表访问权限(C# 权限实现操作注册表)

生活常识 2023-05-15 06:21生活常识www.xinxueguanw.cn

如何获得管理员 的权限,获取管理员 s authority C# authority实现注册表的操作。

目录

1.导言2。主旨3。实现C# 3.1检测是否注册3.2替换参数并写入reg文件,执行3.3更新注册表4。

1. 绪论

当我们自己写C #程序,有了程序定义的文件类型,我们通常希望它满足以下要求

双击自定义文件打开自定义程序。自定义文件有自己的图标。这时候你可以发现大部分答案都在使用微软下的CreateSubKey(String)函数。Win32,但遗憾的是,Win10的注册表项受访问控制列表(ACL)保护。尤其是当你想实现以上两个需求的时候,写HKEY _类_根,程序会报错。

这时候我们可能会进一步提高程序运行时的权限,比如使用管理员权限来启动程序,方式多种多样。虽然可行,但在某些情况下,需要用非管理员权限执行,然后不得不降级。没必要重复,真的很累!而且还会让用户产生疑惑[1]。

受到HandyControl的源码启发,可以使用以下 来实现上述两个要求,不需要升级自己程序的运行权限,从而避免了一系列的麻烦。

2. 主体思路

查看其源代码,利用CMD,执行注册表reg文件,实现读写删注册表.具体实现步骤如下

获取当前程序的主模块的路径检测路径下是否有reg文件,如果有,则退出;如果没有,则认为是之一次启动,所需信息不会写入注册表。继续执行以下步骤读取准备好的txt文件(包括操作注册表的内容),根据需要将txt中操作注册表内容的参数写入reg文件cmd,执行reg文件,自动弹出管理权限获取窗口 是的 实现reg文件操作,以及 不 取消手术。,在上述步骤中可以考虑以下优化方向

在执行reg文件之前,询问用户是否可以写入注册表实现双击打开文件的功能,变得人性化。如果用户单击否,该功能将不再出现。用户想双击打开文件,无从下手。如果目录中的reg被删除,该函数将出现,即使信息已经写入注册表。,我们对其进行优化,如图所示

3. C#实现

在程序属性中,指定好使用的 ico 文件。

假设用户定义的文件后缀是mySuffix。那么上述两个要求的实现都可以按照斋藤飞鸟 的步骤。结合注册表文件的编写 ,使用优化后的程序即可实现。

3.1 检测是否注册

功能注册表。class sroot . open subkey( ;mysuffix )可以读出这个名字,手动,以此来判断它是否存在伪装。对于同一个后缀,可能会有不同的程序实现,所有的值都需要遍历。在关联值中,检查是否有打开/命令值。Registry.classroot.opensubkey(路径)。getvalue (null)可以返回名称对应的值。

private bool IsRegistryExist(字符串后缀,字符串路径){ try { using Registry key hk software=Registry。ClassesRoot.OpenSubKey(后缀);if (hkSoftWare==null)返回false//获取此项下的所有名称string[]svaluenameroll=hk software。getvaluenames();int len=sValueNameColl。长度;//获取for (int i=0的所有名称对应的数据;我leni ) {字符串数据=hkSoftWare。GetValue(sValueNameColl[i])。ToString();if(字符串。等于(数据,字符串。空))继续;注册表项rk=注册表。open subkey($ ;{ data } \ shell \ open \ command )if (rk==null)继续;var commandData=rk。GetValue(null)?ToString();

rk.Close() if (commandData == null) return false if (string.Equals(commandData, string.Empty)) return false if (string.Equals(commandData, path)) return true } } finally { } return false }

3.2 替换参数写入reg文件并执行

本程序基于 WPF ,获取程序所在路径使用的是Process.GetCurrentProcess().MainModule。在替换时,务必注意先后顺序,想知道不按顺序的后果,自己可以试验一下。

private void UpdateRegistry() { // 获取程序运行路径 var processModule = Process.GetCurrentProcess().MainModule if (processModule == null) return if (IsRegistryExist(#34.mySuffix#34, processModule.FileName)) return var processWithSuffix = processModule.ModuleName.Split(#39.#39)[0] + #34.mySuffix#34 var registryFilePath = $#34{Path.GetDirectoryName(processModule.FileName)}\Registry.reg#34 if (!File.Exists(registryFilePath)) { string registryStr = #34?Windows Registry Editor Version 5.00\r

#34 + #34\r

#34 + #34[HKEY_CLASSES_ROOT\##]\r

#34 + #34@=\#34###\#34\r

#34 + #34\r

#34 + #34[HKEY_CLASSES_ROOT\###\DefaultIcon]\r

#34 + #34@=\#34#\#34\r

#34 + #34\r

#34 + #34[HKEY_CLASSES_ROOT\###\shell]\r

#34 + #34\r

#34 + #34[HKEY_CLASSES_ROOT\###\shell\open]\r

#34 + #34\r

#34 + #34[HKEY_CLASSES_ROOT\###\shell\open\command]\r

#34 + #34@=\#34#\#34#34 + #34\r

#34 // 替换 var newRegistryStr = registryStr.Replace(#34####34, processWithSuffix).Replace(#34###34, #34.mySuffix#34).Replace(#34##34, processModule.FileName.Replace(#34\#34, #34\\#34)) File.WriteAllText(registryFilePath, newRegistryStr) } Process.Start(new ProcessStartInfo(#34cmd#34, $#34/c {registryFilePath}#34) { UseShellExecute = false, CreateNoWindow = true }) }

3.3 更新注册表

想要实现程序之一次启动后,仅注册写入一次,将上述函数,放置在OnStartup(StartupEventArgs e)函数中。

protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e) UpdateRegistry() }

4.

在桌面新建自定义文件后,可以实现自定义的 ico 图标(与第3节中,程序指定的ico文件图标相同),双击后,也可以实现打开自定义程序。


需要“管理员身份”才能运行的软件,99% 都是流氓软件 ??

怎么获取注册表更大权限 注册表权限无法完全控制

Copyright@2015-2025 www.xinxueguanw.cn 心血管健康网版板所有