即使用户有管理权限,app也无法写入注册表在程序下设置(和读取)新的注册表值基于.NET2.0,目前它运行在Windows764位上。这是我的ocde:RegistryKeysoftwareKey=Registry.LocalMachine.OpenSubKey("Software",true);RegistryKeyMyKey=softwareKey.CreateSubKey("MyApp");RegistryKey=MyKey.CreateSubKey("MyKey");selfPlacingWindowKey.SetValue("instaldateperson",datestr+usrname);我在运行VisualStudio2010时遇到的问题是它运行应用程序但以我的身份登录,我是本地管理员组的用户和成员..但我无法创建密钥(尽管我是本地管理员组的一部分administrators组,谁有权这样做)。我也不知道如何登录(但这也不是我想要的,因为那样我就把Adminuser和密码放在代码中,我已经是管理员了?那为什么呢?)如果是根本不可能,是否有创建注册表项的选项?不知何故,他们被添加到项目等......我在这里有点困惑。仅仅因为您以管理员身份运行(或使用具有管理权限的帐户)并不意味着这些管理权限将始终有效。这是一种安全措施,可防止恶意软件利用贪婪地使用计算机并始终拥有管理权限的用户。要获得管理访问权限,您需要提升流程。有两种方法可以做到这一点:使用清单表明您的应用程序需要管理权限,从而在启动时请求提升。这意味着您的应用程序将始终运行升级,并且只应在应用程序需要时使用。例如,Windows注册表编辑器(RegEdit)可以执行此操作,如果没有管理权限,您几乎无法执行此操作。在MSDN或我的回答中查找有关如何执行此操作的信息。基本上,您只想将以下行添加到您的清单中:如果您只需要某些任务的管理权限(即将特定设置保存到注册表)而应用程序的其余部分不需要它,您应该启动一个新的Elevate这样做的过程。目前无法提升当前流程,因此您实际上需要剥离新流程。这种方法的优点是您的应用程序不必一直以管理权限运行(这提高了安全性),没有管理权限的用户仍然可以运行您的应用程序来执行其他所有操作(即,除了一两个需要提升)除了任务之外的一切。您分叉出一个单独的进程,该进程仅包含使用Process类写入注册表所需的逻辑,并使用runas动词请求提升此进程。有关更多信息,请参阅此问题。我还写了一个答案,提供了如何从C#完成的完整描述,包括示例代码。当然,正如其他答案所提到的,应用程序的设计更有可能是错误的。Windows安全模型整个逻辑是常规应用程序不需要管理权限。他们不需要写入注册表或做其他可能危及机器的事情。如果您需要保留设置,我可以建议另外两种可能的方法:认识到Windows确实是一个多用户操作系统,只为当前用户编写设置。无论如何,这是有道理的,因为不同的用户通常有不同的设置和偏好。您需要使用HKEY_CURRENT_USER,而不是注册表的HKEY_LOCAL_MACHINE分支(需要管理权限才能访问)。将第一行代码更改为:RegistryKeysoftwareKey=Registry.CurrentUser.OpenSubKey("Software",true);这完全消除了通过使用.NET中内置的逻辑来写入注册表以保留应用程序设置的所有麻烦和复杂性。开始阅读此处或此处或MSDN上的答案以了解如何执行此操作。我会说这是你最好的选择。不要自己编写复杂的代码来做你所使用的框架内置了对轻松做事的支持。您的应用程序设计可能有误。标准桌面应用程序不应写入HKEY_LOCAL_MACHINE。由于UAC,你需要有管理员权限并且需要在升级过程中运行才能写入HKLM。如果您的应用程序确实需要更改HKLM,请考虑在安装时执行此操作,因为安装程序将被提升。如果桌面应用程序确实需要写入HKLM,那么它应该考虑将应用程序中需要运行的部分分离到一个单独的进程中。否则,用户将厌倦必须通过UAC对话框才能运行您的应用程序。即使他们不使用写入HKLM的应用程序部分。如果您强制整个应用程序需要提升,标准用户将根本无法运行它。运行VisualStudio时无法在HKEY_LOCAL_MACHINE下创建密钥的原因是因为VisualStudio未作为提升的进程运行。对于最终用户,应用程序的清单需要表明需要完整的管理员权限。HereisthedocumentationonembeddingmanifestsforUAC如果注册表项不需要在机器上是全局的,请考虑写入HKEY_CURRENT_USER。恢复。在项目中创建一个.manifest文件。给它一个与可执行文件相同的名称。"name_of_executable.exe.manifest"Lastchangeorcreatemarkup:PreviousanswersmentionedthatyouneedtospecifyinthemanifestthatyouneedadminprivilegestouseHKLM你可以创建一个清单;右键单击您的项目,添加新的单击单击常规单击应用程序清单文件单击添加以打开清单文件,找到并取消注释requireAdministrator行一个可能会让您感到沮丧的更微妙的事情是在项目设置中勾选首选32位。这将意味着注册表无法获得它需要的访问掩码,并且它将在没有内部异常的情况下默默地失败,因为错误处理程序需要相同的访问掩码,因此无法利用它。除非您绝对需要在用户之间保留设置,否则您应该避免在注册表的这一部分存储内容。注册表也不应该用于存储密码或其他敏感信息,因为即使使用ACL也无法可靠地控制访问。以上是C#学习教程:即使用户有管理权限,app也无法写入注册表中共享的所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: