Windows有限的用户安装

我有一个Win32应用程序,其中包括一个EXE,一个ActiveX控件(DLL)和一个COM服务器(EXE),我使用Inno Setup 5构build我的安装程序。 我们的许多客户在用户没有pipe理权限的情况下使用有限的用户帐户,并且因为COM组件需要注册(写入HKEY_CLASSES_ROOT),所以我的安装文件必须以高级(admin)权限运行。 我认为这是不可避免的(可惜,我不能使用免注册的COM,因为我有EXE COM服务器)。 不过,我想创build一个更新安装程序,可以作为有限的用户运行,并寻找一些build议。

我在想的是以下几点:

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

这意味着我的客户可以升级到最新,最好的版本,而无需使用pipe理员帐户的麻烦。 这是可以接受的还是这可能咬我的背面? 我很确定谷歌浏览器做了类似的事情,但是因为它没有COM组件(据我所知),即使最初的设置可以作为一个有限的用户。

其他任何人面对这个问题的build议都会非常受欢迎。

Solutions Collecting From Web of "Windows有限的用户安装"

我不知道,但我似乎记得COM服务器支持每个用户的安装,也许这也适用于EXE服务器。

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

COM基础结构应该首先按用户查找,然后按每台机器查找。

无论如何,这是值得一试的。

好吧,我找到了一种方法来创建一个有限的用户安装脚本,同时我的COM服务器和COM对象被注册为每个用户。

我正在使用MSVC 2008附带的ATL(v9)的最新版本来创建我的COM服务器和COM对象。 原来你可以通过新的/RegserverPerUser开关注册每个用户的COM服务器。 我在XP,Vista和Windows 7上用有限的用户帐户测试过,并且完美地工作。

接下来,COM控件。 再次,ATL9来救援。 您可以通过确保RegSvr32调用您的控件的DllInstall函数并将用户的命令行参数传递给每个用户来注册一个控件。 所以,要以这种方式注册一个控件,你只需要:

 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安装路径。

如果你倾倒inno-setup并使用MSIs – MSI文件支持有限的用户安装补丁的想法。 管理员必须授权初始安装,此后,msi文件修补程序中的数字签名将被提升的msi服务处理,而不需要用户提升。

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

您需要重新考虑您的承诺…对文件夹的写入权限也可以允许同一用户执行程序,这是99%的病毒/恶意软件功能的原因。 请了解一些有关软件限制策略和Windows 7中内置的新应用锁定器行为,以便计算基础架构不会向后移动。