2

インストール時にMyapp.exe.configファイル(app.configファイルに基づいて生成された)をインストールディレクトリに配置するサービスがあります。インストールプロセス中に、インストールを構成するためにこのファイルの詳細が必要です。特に、サービスのServiceProcessInstallerインスタンスのAccount / Username / Passwordフィールドを微調整して、実行時に特定のユーザーとして実行されるようにする必要があります。

ただし、インストールプロセス中に、インストーラーはまだレジストリ設定を設定しておらず、Myapp.exe.configをインストールディレクトリにコピーしていません...したがって、これらの値を取得する方法がありません。つまり、サービスを正しいものとしてインストールできません。ユーザー。現在私ができる唯一の方法は、ユーザー/パスの値をProjectInstallerクラスにハードコーディングすることですが、この方法でそれを行うことはできません。それはただ間違っています。

特定のユーザーとしてサービスをインストールする方法と、インストールプロセス中にそれらの資格情報にアクセスする方法に関するWindowsインストールのベストプラクティスはありますか?

現在、私は次のようなことを試みています:

namespace MyService
{
   [RunInstaller(true)]
   public partial class ProjectInstaller : System.Configuration.Install.Installer
   {
      public ProjectInstaller()
      {
         InitializeComponent();

         //Set the user credentials.
         //NOTE: Eventually this needs to be updated to pull these values out of a
         //      conf file.  The problem now is that the location of the conf file
         //      is tied to a registry entry for the location of the service which
         //      may or may not exist when this block is executed.
         /* This is the only way I can get it to work, but this is
          * too horrible to ever actually do it this way:
         serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User;
         serviceProcessInstaller1.Username = "DOMAIN\\user";
         serviceProcessInstaller1.Password = "password";
          */

         // Try to pull the service's registry values to know where it installed:
         RegistryKey keyService = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\MyService");
         string path = ((string)keyService.GetValue("ImagePath"));
         path = path.Substring(1, path.LastIndexOf('\\'));

         string user = someValueFromFileIOontheAbovePath1,
                pass = someValueFromFileIOontheAbovePath2;

         serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User;
         serviceProcessInstaller1.Username = user;
         serviceProcessInstaller1.Password = pass;
         //Doesn't work because install isn't complete and there aren't reg settings
         // yet, and even if I had the path the .config file is not written yet so
         // there's no file to parse.
      }
   }
}

これらのパラメータを保持するいくつかの.configファイル:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <appSettings>
      <add key="User" value="DOMAIN\bob"/>
      <add key="Password" value="secret"/>
   </appSettings>
</configuration>

これらのユーザー/パス値をバイナリにハードコーディングせずに、インストールにプルするにはどうすればよいですか?

ありがとう。

4

2 に答える 2

2

さまざまなレベルのセキュリティを備えたオプションがいくつかあります。

1)ServiceAccount.Userを指定したが、ユーザー名とパスワードを指定しなかった場合、Microsoftのクラスは、入力する資格情報のウィンドウをポップアップ表示します。クレデンシャルはどこにも保存されないため、これは非常に安全ですが、ポップアップでは、インストーラーを実行している人が入力内容を明確に示していません。さらに、ポップアップは他のインストール画面とうまく流れません。

2)MSIにユーザー名とパスワードをパラメーターとしてインストーラークラスに渡させることができます。ただし、値はInstallLogファイルにプレーンテキストで残されているため、確実に削除する必要があります。

3)MSIにDPAPI(System.Security.Cryptography.ProtectedDataクラス)を使用してレジストリ内の名前/パスワードを暗号化させてから、暗号化を解除してサービスインストーラークラスで使用します。

于 2012-05-14T18:12:02.497 に答える
1

MSIで目的を達成する1つの方法は、コミットでカスタムアクションを使用して、カスタムオブジェクトインストーラーを実行することです。コミットアクションはファイルがコピーされた後に実行されるため、ファイルはユーザーが選択したインストールディレクトリに存在します。

于 2012-05-14T18:13:36.693 に答える