2017-03-15 1 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

ありがとう@HarryJohnston最初にLogonUserとDuplicateTokenを使用する必要がありましたが、動作し、レジストリにSIDを作成しました。ご協力いただきありがとうございます –

関連する問題