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

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

问题描述:

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

获取用户帐户的第一步已经成功。但是,为了使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在注册表中没有创建,直到用户首次登录。

那么,有没有办法为使用维克斯,或C#创建一个环境变量对于从未登录的新创建的用户?

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

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

+1

谢谢!那么在调用LoadUserProfile之后是否可以添加这些注册表项?我想答案是肯定的。你知道WiX是否提供了一些相同的命令? –

+1

一旦加载配置单元,至少在理论上,你已经拥有的代码应该可以工作。只要WiX去,就无法帮到你。 –

+0

谢谢@HarryJohnston我需要首先使用LogonUser和DuplicateToken,但它确实工作并确实在注册表中创建了SID。谢谢你的帮助 –