c++ - Windows 受限用户安装

标签 c++ windows com inno-setup

我有一个 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 组件(据我所知),即使是初始设置也可以作为受限用户。

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

最佳答案

好的,我找到了一种创建受限用户安装脚本的方法,同时我的 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 的支持。

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

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

关于c++ - Windows 受限用户安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437450/

相关文章:

c++ - Qt/C++中多线程的随机函数调用

windows - 是否有一个 API 可以远程读取 Windows 机器的审计配置?

c# - 执行后如何保持控制台窗口打开?

c++ - 为什么我的程序不能识别素数?

c++ - MS Visual C++ 通过单击按钮启动功能而不阻塞对话框

C++ 单引号语法

c++ - 从 win32 应用程序运行外部 exe

powershell - 如何将自定义 COM 枚举指定为 PowerShell 方法参数

delphi - 在 Delphi 中重命名 DLL

python win32com "PumpWaitingMessages()"处理