2017-03-15 12 views
4

우리는 제품을 위해 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#으로 하나를 사용할 수있는 방법이 로그인하지 않은 새로 생성 된 사용자의 경우?

답변

2

예, C#에서 LoadUserProfile Win32 API 함수를 P/호출 할 수 있습니다. 이렇게하지 않으면 사용자 프로필이 만들어지고 사용자의 레지스트리 하이브가로드됩니다.

대화 형 로그온에 사용되는 계정에는이 방법을 사용하지 않는 것이 좋지만 서비스 계정에는 충분히 안전해야합니다.

+1

감사합니다. 그래서 LoadUserProfile을 호출 한 후에 이러한 레지스트리 키를 추가 할 수 있습니까? 나는 그 대답이 '예'라고 생각한다. WiX가 동일한 명령을 제공하는지 알고 있습니까? –

+1

하이브가로드되고 나면, 이미 이론적으로는 이미 가지고있는 코드가 작동해야합니다. WiX가가는 한 당신을 도울 수 없습니다. –

+0

Thanks @HarryJohnston 먼저 LogonUser 및 DuplicateToken을 사용해야했지만 작동했지만 레지스트리에 SID를 만들었습니다. 당신의 도움을 주셔서 감사합니다 –