无法在启用UAC的Excel中的Hkey_Local_Machine中创建注册表项

时间:2014-06-30 18:17:04

标签: c# excel vba excel-vba

我有一个excel应用程序(此应用程序就像是我们公司的产品),我使用Excel和Excel创建了许可过程。 VBA。当用户使用产品密钥注册应用程序时,将在Registry中创建一个条目,并且每次打开应用程序时都会验证该条目。我使用win-API函数和VBA创建密钥,如下所示。

Result = RegCreateKeyEx(HKey:=HKLM, lpSubKey:=SubKeyName, Reserved:=0&, lpClass:=vbNullString, _
                dwOptions:=REG_OPTION_NON_VOLATILE, samDesired:=KEY_ALL_ACCESS, _
                lpSecurityAttributes:=SecAttrib, phkResult:=HKey, lpdwDisposition:=Disposition)

此产品许可应适用于本地计算机中的所有用户。所以我将产品密钥保存在HKey_Local_Machine下的注册表中。但是在启用UAC的情况下,虽然用户具有管理员权限,但我无法读取/写入注册表。我总是得到错误代码5(访问被拒绝)。对HKey_Current_User的读/写工作正常,但在我的情况下这不是一个选项,因为产品注册必须适用于本地计算机上的所有用户。如果我将UAC降低到Never_Notify_Me,那么对HKLM的读/写工作正常。

我尝试了什么:

  1. 我尝试以管理员身份运行excel应用程序(Excel-> Properties->以管理员身份运行此程序)。读/写注册表HKLM有效,但如果excel尚未打开,我无法打开excel应用程序,这意味着双击该应用程序。收到错误“将命令发送到程序时出现问题”。所以客户不会接受这个解决方案。

  2. 我创建了一个C#dotnet dll,用于写入注册表并使用以下信息向其添加应用程序清单,以使其具有UAC感知能力。

  3. <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
              <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
          </requestedPrivileges>
    </security>
    

    这很好用,当我用它作为exe(默认情况下exe作为管理员运行),但是当我将它转换为COM可见dll并添加到Excel引用并尝试创建注册表项时,它表示访问权限拒绝。

    1. 在C#中创建了一个RegistrySecurity对象,并提供了如下所示的读写权限。但同样存取被拒绝的问题出现了。
    2.    RegistrySecurity rs = new RegistrySecurity();
          rs.AddAccessRule(new RegistryAccessRule(user, 
              RegistryRights.WriteKey | RegistryRights.ReadKey| RegistryRights.Delete, 
              InheritanceFlags.None, 
              PropagationFlags.None, 
              AccessControlType.Allow));
      
      1. 谷歌搜索是否有一个WIN-API允许我通过暂时降低UAC级别或以某种方式绕过它来读取/写入注册表。但是这里也没有运气。
      2. 现在有人可以指导我如何通过这种情况。我正在寻找使用C#dotnet dll的解决方案或任何其他解决方案,如解决excel - 运行管理问题。 - 非常感谢任何建议..

1 个答案:

答案 0 :(得分:0)

由于无法绕过UAC并将产品密钥写入HKey_Local_Machine且UAC安全级别设置为高,现在我将产品密钥信息写入注册表中的HKey_CurrentUser。 即使UAC安全级别设置为高,我们也可以使用VBA&amp; amp;读取和写入HKey_CurrentUser。 Win-API。但是,如果要求应用程序在给定系统上的所有登录帐户中运行,则此方法的缺点是我的应用程序的产品密钥需要一次一个地写入每个登录帐户的HKey_CurrentUser。 谢谢大家的帮助。

相关问题