3

我有一个 Win32 应用程序,其中包括一个 EXE、一个 ActiveX 控件 (DLL) 和一个 COM 服务器 (EXE),我正在使用 Inno Setup 5 来构建我的安装程序。我们的许多客户使用受限的用户帐户,用户没有管理员权限,并且因为需要注册 COM 组件(写入 HKEY_CLASSES_ROOT),我的安装文件必须以提升的(管理员)权限运行。我认为这是不可避免的(遗憾的是,由于我有 EXE COM 服务器,我不能使用免注册 COM)。但是,我想创建一个可以作为受限用户运行的更新安装程序,并正在寻找一些建议。

我的想法如下:

  • 初始设置(首次安装)将应用程序安装到 %ALLUSERSPROFILE%\Application Data\CompanyName\AppName 而不是 %PROGRAMFILES%。COM 组件正常注册(因为它们不存在)。
  • 后续更新(使用不同的 Inno Setup 脚本)将简单地将新文件复制到 %ALLUSERSPROFILE%\Application Data\CompanyName\AppName。希望即使是受限制的用户也可以对该文件夹具有写入权限,并且由于 COM 组件已经注册,因此不需要管理员访问权限。

这意味着我的客户可以升级到最新最好的版本,而无需使用管理员帐户。这是可以接受的还是可能会咬我的后背?我很确定 Google Chrome 会做类似的事情,但由于它没有 COM 组件(据我所知),即使初始设置也可以作为受限用户使用。

确实非常欢迎遇到此问题的其他人提出任何建议。

4

4 回答 4

4

好的,我找到了一种创建受限用户安装脚本的方法,其中我的 COM 服务器和 COM 对象都是按用户注册的。

我正在使用 MSVC 2008 附带的最新版本的 ATL (v9) 来创建我的 COM 服务器和 COM 对象。事实证明,您可以通过新/RegServerPerUser开关为每个用户注册 COM 服务器。我在 XP、Vista 和 Windows 7 上使用有限的用户帐户对此进行了测试,它运行良好。

接下来,COM 控件。再次,ATL9 进行救援。你可以通过确保RegSvr32调用你的控件的DllInstall函数,向它传递一个命令行参数来为每个用户注册一个控件user。因此,要以这种方式注册控件,您只需执行以下操作:

regsvr32.exe /i:user /n MyControl.DLL

同样,我在 XP、Vista 和 Windows 7 上进行了测试,它运行良好。

然后我对我的 Inno Setup 脚本进行了以下更改:

  • 如果用户具有管理员权限,默认安装文件夹将是{pf}(即 C:\Program Files)。如果不是,则默认为{commonappdata}(即 C:\Documents and Settings\All Users)。
  • 使用新/RegServerPerUser开关注册我的 COM 服务器。
  • 我从我的 COM 对象中删除了regserver标志,而是添加了对使用新的“用户”开关调用 regsvr32 的支持。

{code}使用 Inno Setup功能可以轻松完成所有这些更改。

感谢 Kim 为我设置了每个用户的 COM 安装路径。

于 2009-09-21T06:53:57.370 回答
2

我不确定,但我似乎记得 COM 服务器支持按用户安装,也许这也适用于 EXE 服务器。

如果是这样,请更改您的注册码以将信息写入HKEY_CURRENT_USER\Software\Classes而不是HKEY_CLASSES_ROOT.

COM 基础结构应该首先对每个用户进行查找,然后再对每个机器进行查找。

无论如何都值得一试。

于 2009-09-17T19:39:29.120 回答
0

如果您转储了 inno-setup 并使用了 MSI - MSI 文件支持有限用户安装补丁的想法。管理员必须授权初始安装,此后,补丁 msi 文件中的数字签名由提升的 msi 服务处理,无需用户提升。

您可以自己复制这个基本概念 - 在初始管理安装期间,安装具有必要访问权限的服务组件。处理补丁时,要求服务进程处理 EXE COM 服务器注册。

于 2009-09-17T08:29:34.500 回答
0

您需要重新考虑您的方法... 对文件夹的写访问权限比还允许同一用户执行程序是所有病毒/恶意软件功能的 99% 的原因。请了解一些有关软件限制策略和 Windows 7 中内置的新 App Locker 行为的信息,以便计算基础设施可以向前而不是向后移动。

于 2011-10-31T14:44:15.643 回答