无法使用UAC在Excel中的Hkey_Local_Machine中创buildregistry项

我有一个Excel应用程序(这个应用程序就像我们公司的产品),我已经使用Excel和VBA创build了许可stream程。 当用户使用产品密钥注册应用程序时,将在registry中创build一个条目,并在每次打开应用程序时对其进行validation。 我使用win-API函数和VBA来创build密钥,如下所示。

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的registry中。 但随着UAC,我无法读取/写入registry,虽然用户具有pipe理员权限。 我总是得到错误代码5(拒绝访问)。 对HKey_Current_User的读/写虽然工作正常,但这不是我的select,因为产品注册必须适用于本地机器上的所有用户。 如果我把UAC降低到Never_Notify_Me,那么对HKLM的读/写就可以正常工作。

我试过了:

  1. 我尝试以pipe理员身份运行Excel应用程序(Excel->属性 – >以pipe理员身份运行此程序)。 读取/写入registryHKLM的作品,但我不能打开excel应用程序,如果excel尚未打开,即通过双击应用程序。 收到错误“发送命令到程序时出现问题”。 所以客户不会接受这个解决scheme。

  2. 我创build了一个用于写入registry的C#dotnet dll,并添加了一个应用程序清单,并使用以下信息使其可以识别UAC。

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

这工作正常,当我使用它作为一个exe文件(默认情况下EXE作为pipe理员运行),但是现在我把它转换为COM可见的DLL,并添加到Excel引用,并尝试创buildregistry项,它说拒绝访问。

  1. 在C#中创build一个RegistrySecurity对象,并赋予读写权限,如下所示。 但同样的访问被拒绝的问题出现。
  RegistrySecurity rs = new RegistrySecurity(); rs.AddAccessRule(new RegistryAccessRule(user, RegistryRights.WriteKey | RegistryRights.ReadKey| RegistryRights.Delete, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow)); 
  1. 谷歌search是否有一个WIN-API允许我通过暂时降低UAC水平或绕过它来读/写registry。 但是这里也没有运气。

现在有人可以请指导我如何能通过这种情况下通过我的方式。 我正在寻找一个解决scheme,使用C#dotnet dll或任何其他解决scheme,如解决excel – 作为pipe理问题运行。 – 高度赞赏任何build议..

由于无法绕过UAC并将产品密钥写入HKey_Local_Machine并将UAC安全级别设置为高,现在我正在将registry中的产品密钥信息写入HKey_CurrentUser。 即使UAC安全级别设置为高,我们也可以使用VBA和Win-API读写HKey_CurrentUser。 但是这种方法的缺点是,如果应用程序需要运行在给定系统上的所有login帐户中,那么我的应用程序的产品密钥需要一次一个地写入HKey_CurrentUser。 感谢所有的帮助。