我们正在尝试在Wix中为一个产品构build一个安装程序。 本产品的一部分需要安装elasticsearch作为服务,并将其作为服务运行。 该服务应该在一个单独的用户帐户下运行。
获取用户帐户的第一步已经成功。 但是,为了使elasticsearch正确运行,我们需要设置一些环境variables。 为了减less意外用户错误的机会,我们必须在elasticsearch用户下设置这些variables,而不是像机器范围那样。
为此,我们需要一种只在指定用户下创buildvariables的方法。 但是,我们还没有能够解决这个问题,无论是使用Wix还是C#扩展。
我们来的最接近的是查询C#中的ManagementObject
并发现ELASTICUSER
的SID。 理论上,我们应该能够在registry中的"HKEY_USERS\<SID>\Environment"
下编写另一个环境variables,如图所示。
var query = new SelectQuery("Win32_UserAccount"); var manObjSearch = new ManagementObjectSearcher(query); var stringToWrite = string.Empty; foreach (var envVar in manObjSearch.Get()) { if (envVar["Name"].ToString().ToUpperInvariant() == "ELASTICUSER") { elasticUserSid = envVar["SID"].ToString(); } } using (var key = Registry.Users.OpenSubKey(elasticUserSid + "\\Environment")) { if (key == null) { return; } key.SetValue("OurVariable", "Value"); }
但是,似乎在用户首次login之前,registry中不会创buildSID。
那么,有没有什么办法可以使用Wix或C#来为从未login过的新创build的用户创build一个环境variables?
是的,从C#可以P /调用LoadUserProfile
Win32 API函数。 这将创建用户的配置文件,如果它尚不存在,并加载用户的注册表配置单元。
我不会推荐这种方法用于交互式登录的帐户,但对于服务帐户来说应该足够安全。