在C#中为新用户创build环境variables

我们正在尝试在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函数。 这将创建用户的配置文件,如果它尚不存在,并加载用户的注册表配置单元。

我不会推荐这种方法用于交互式登录的帐户,但对于服务帐户来说应该足够安全。