在 C# 中为新用户创建环境变量
Create environment variables for a new user in C#
我们正尝试在 Wix 中为产品构建安装程序。该产品的一部分需要将 elasticsearch 作为服务安装,并将其作为服务获取 运行ning。该服务应 运行 在单独的用户帐户下。
第一步,设置用户帐户,已成功。但是,为了让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# P/Invoke LoadUserProfile
Win32 API 函数。这将创建用户的配置文件(如果尚不存在),并加载用户的注册表配置单元。
我不建议将此方法用于将用于交互式登录的帐户,但对于服务帐户来说应该足够安全。
我们正尝试在 Wix 中为产品构建安装程序。该产品的一部分需要将 elasticsearch 作为服务安装,并将其作为服务获取 运行ning。该服务应 运行 在单独的用户帐户下。
第一步,设置用户帐户,已成功。但是,为了让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# P/Invoke LoadUserProfile
Win32 API 函数。这将创建用户的配置文件(如果尚不存在),并加载用户的注册表配置单元。
我不建议将此方法用于将用于交互式登录的帐户,但对于服务帐户来说应该足够安全。