【问题标题】:Create environment variables for a new user in C#在 C# 中为新用户创建环境变量
【发布时间】:2017-03-15 16:38:57
【问题描述】:

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

第一步,设置用户帐户,已经成功。但是,为了让elasticsearch能够正常运行,我们需要设置一定的环境变量。为了减少意外用户错误的机会,我们必须在 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# 中为从未登录过的新创建用户创建环境变量?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!那么是否可以在调用 LoadUserProfile 之后添加这些注册表项?我想答案是肯定的。你知道 WiX 是否提供了一些命令来做同样的事情吗?
    • 加载配置单元后,您已经获得的代码应该可以工作,至少在理论上是这样。就 WiX 而言,帮不了你。
    • 感谢@HarryJohnston 我需要先使用 LogonUser 和 DuplicateToken,但它确实有效并且确实在注册表中创建了 SID。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2019-08-06
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多