我正在使用WiX构建一个安装程序来安装程序,每台机器(不是每个用户),并且它为他们提供了注册程序的选项。注册涉及输入用户名和组织(或接受Windows设置的某些默认值),并输入有效的注册密钥。验证注册密钥后,我使用此信息在HKEY_LOCAL_MACHINE区域中编写注册表设置。在Windows下,当运行MSI时,它会自动提示输入管理员密码,以便能够在HKEY_LOCAL_MACHINE中设置注册表值。到目前为止生活还不错......
我在MSI中包含一个选项,让用户可以选择将注册推迟到以后的某个时间点。但是,如果用户是普通用户并且他们正在运行应用程序,如果我在应用程序中有一个提示输入name / org / product-key的对话框,则Windows不会将该信息写入HKEY_LOCAL_MACHINE。因此,用户无法像普通用户一样使用应用程序本身来执行MSI在提示输入管理员凭据后执行的每台计算机注册。
我的想法是,对于安装后注册,要么(a)从应用程序中找到提升权限的方法,并提示管理员凭据,允许它写入HEKY_LOCAL_MACHINE(这可能吗?),( b)在安装程序中包含一个选项,该选项在运行且应用程序已安装且未注册时,按照正常安装期间的方式完成注册。然后它会提示输入管理员凭据并且生活再次良好。或者,(c)创建一个单独的MSI,只进行注册,将其与程序一起安装,并在用户选择程序中的“Register ...”命令时从程序中调用该MSI。
我之前没有看到过这些方法中的任何一种,所以我不确定这两种方法是不是很好。除此之外,我不确定在安装后,我可以方便地允许用户进行每台机器应用注册。理想情况下,我希望能够从应用程序中的命令执行此操作,但重新运行安装MSI将是最低限度的可接受。
这通常是怎么做的?或者每台机器的安装是否通常伴随着每台机器的注册?
答案 0 :(得分:2)
非常好的问题 - 我自己多次处理过这个问题。没有理想的解决方案,但有几种选择(正如您已经发现的那样)。
在回答之前,我想指出,我强烈反对在设置本身中进行过多的注册和配置。它很容易出错,并且在应用程序本身中做得更好,原因很多: Installer with Online Registration for Windows Application (建议快速阅读 - 来自现实生活经验的花絮)。
如您所知,一种选择是仅在HKCU中保留许可证密钥和注册。除非您想在盒子上的许多用户之间共享许可证密钥,否则这通常是可以接受的。许可证密钥如果添加到HKCU,通常也会与用户一起漫游到其他计算机 - 这可能是有帮助的或可取的。
就个人而言,这是我更喜欢的选项:不在设置中注册任何内容,而是从应用程序写入HKCU或用户配置文件(如上面链接中所述)。如上所述,唯一的缺点是您无法将共享许可证密钥写入HKLM,因此它适用于所有用户,而不仅仅适用于单个用户。 这似乎是您所描述问题的核心。
答案 1 :(得分:1)
这种注册通常使用标准的Windows Installer属性来完成,因此它可以正常工作。
如果您有验证密钥,则它通常与标准PIDKEY属性关联(在对话框中),然后在验证后成为ProductId属性。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370826(v=vs.85).aspx
同样,用户名和公司名称在对话框中与USERNAME和COMPANYNAME属性相关联。
在此之后,他们可以通过(Win32)MsiGetProductInfo()通过询问RegOwner等来获取它们:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370130(v=vs.85).aspx
或类似的API(WMI执行其中一些操作)。
一般来说,您只需从对话框中设置属性即可,只需将其写入注册表即可。