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

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

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

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

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

我们最接近的是查询 ManagementObject在 C# 中并发现我们的 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# 为从未登录的新创建用户创建环境变量吗?

最佳答案

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

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

关于c# - 在 C# 中为新用户创建环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42815743/

相关文章:

wix - 当产品 ID 为 * 时卸载 WiX 中的快捷方式以允许进行重大升级?

c++ - 实例化基类 - Win32 对话框类

c++ - 如何移动到文件夹并执行 Windows 命令行调用

xml - 使用 Wix 从控制面板使用快捷方式卸载 exe

c# - 如何从 c# dll、c++/cli 调用的 dll 返回字节数组、uint 值

windows - 如何使用 Windows 命令行打开提升的 cmd?

wix - 在 wix 安装程序中启用日志记录

c# - Linq System.OutofMemoryException 异常

c# - Asp.net MVC 下拉列表中的多个字段

c# - 在字符串正则表达式 C# 中查找一个单词,然后查找一个值编号