如何使WiX在新创建的用户的上下文中安装服务

时间:2014-08-14 04:08:33

标签: windows-services wix

我正在使用Wix创建一个Windows服务的msi包。我想在没有管理员权限的常规用户帐户下运行该服务。为了更好的安全性,我想将服务的文件放在个人用户文件夹中(例如AppData \ Local \ Programs \ CompanyName ...用于二进制文件,AppData \ Local \ CompanyName ...用于配置和数据文件)用户的文件访问权限。我想象以下场景:

  1. 在每台计算机上下文中启动msi。
  2. 在安装的客户端阶段,请询问用户名和密码。
  3. 在安装的服务器阶段:
    a)创建用户
    b)更改其上下文并将程序文件安装到ProgramFilesFolder并将数据文件安装到LocalAppDataFolder
    c)更改回管理上下文并安装和配置要在用户帐户下运行的服务
  4. 我陷入了步骤3 b),因为我已经了解到,在切换到安装的服务器端后,我无法更改安装上下文。请你就我如何实现我在第一行中描述的目标向你提出建议。特别是如果我必须将文件复制到另一个用户的个人文件夹,那么获取其路径的最可靠方法是什么?或者我错了,将服务安装到个人用户文件夹中是不好的做法?

    我知道内置本地服务帐户的存在,但希望进一步缩小服务环境。

2 个答案:

答案 0 :(得分:1)

本地appdata文件夹是问题所在。如果您创建用户帐户,则在用户执行交互式登录之前不会创建用户文件夹,即使在某些环境中,也可能通过策略重定向。我不知道本地数据更好(在安全意义上)然后是ProgramFiles文件夹,它对管理员进行了写限制。我只是将服务二进制文件安装到ProgramFiles。在UI中,您可以收集凭据并在安装服务时使用它们。使用外部凭据的一个问题是修复和有时修补等问题将失败,除非您有可用的凭据,将它们保存在安全的地方,因为否则您使用的属性值在修复时将为空。如果localservice工作,那么使用它。

服务具有什么特权通常无关紧要,因为它通常知道它正在做什么。这只是一个问题,如果它调用可能尝试做坏事的未知外部代码,或者被要求做随机事情,如“运行此程序”或“复制此文件”而不进行任何内部验证或具有白名单它允许做什么。因此,了解您尝试解决的具体问题或仅遵循良好做法可能会有所帮助。

答案 1 :(得分:0)

我认为你不会过于谨慎,服务隔离绝对是一个很好的目标。如果您可以要求Win7 / 2008R2或更高版本,则可以在virtual account下运行该服务。虚拟帐户不需要密码,并且它们无法像SYSTEM一样完全破坏机器。您应该能够像这样使用它:

<ServiceInstall Account="NT SERVICE\$(var.ServiceName)" Name="$(var.ServiceName)".../>

服务可执行文件在程序文件中实际上更好,这样服务就无法修改自己的exe。