在C#中为新用户创建环境变量

时间:2017-03-15 16:38:58

标签: c# windows wix environment-variables user-accounts

我们正在尝试在Wix中为产品构建一个安装程序。此产品的一部分需要将elasticsearch作为服务安装,并使其作为服务运行。该服务应在单独的用户帐户下运行。

设置用户帐户的第一步是成功的。但是,为了使elasticsearch能够正确运行,我们需要设置某些Environment变量。为了减少无意中出现用户错误的可能性,我们必须在elasticsearch用户下设置这些变量,而不是在整个机器范围内。

为此,我们需要一种仅在指定用户下创建变量的方法。但是,我们还没有能够找到一种方法来使用Wix或C#扩展。

我们最接近的是查询C#中的ManagementObject并发现ELASTICUSER的SID。理论上,我们应该能够在"HKEY_USERS\<SID>\Environment"下向注册表编写另一个环境变量,如图所示。

        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");
        }

但是,在用户首次登录之前,似乎不会在注册表中创建SID。

那么,有没有办法使用Wix,或者在C#中为新创建的用户创建一个从未登录过的环境变量?

1 个答案:

答案 0 :(得分:2)

是的,从C#可以P / Invoke LoadUserProfile Win32 API函数。这将创建用户的配置文件(如果它尚不存在),并加载用户的注册表配置单元。

我不建议将此方法用于将用于交互式登录的帐户,但它对于服务帐户应该足够安全。