1

Windows サービスをインストールする MSI インストーラーがあり、カスタム アクションでHKEY_LOCAL_MACHINE/SOFTWARE/MYSoftwareキーのレジストリにいくつかの値を書き込む必要があります。

私はこれをやろうとしていますが、うまくいきませんが、Windows サービスからはうまくいきます。どこが間違っているのか誰にも教えてもらえますか?

string registryLocaltion = AgentProperties.TMAGENT_REGISTRY_LOCATION
                           + @"\" +AgentProperties.TMAgentVersion;

tmKeyMain = Registry.LocalMachine.OpenSubKey(registryLocaltion, true);
if (tmKeyMain == null)
{
    log.Error("Unable to open registry key " + registryLocaltion);
}

tmKeyMain.SetValue("UseProxySettings", settings.UseProxySettings);
if (settings.UseProxySettings)
{
    tmKeyMain.SetValue("ProxyHost", settings.ProxyHost);
    tmKeyMain.SetValue("ProxyPort", settings.ProxyPort);
    tmKeyMain.SetValue("ProxyUsername",
              GenericHelper.ConvertToBase64Encoding(settings.ProxyUsername));
    tmKeyMain.SetValue("ProxyPassword",
              GenericHelper.ConvertToBase64Encoding(settings.ProxyPassword));
    tmKeyMain.SetValue("ProxyExclusion", settings.ProxyExclusion);
    tmKeyMain.SetValue("BypassProxy", settings.BypassProxy);
}

このコードは、私の Windows サービスでは正常に機能していますが、MSI インストーラーのカスタム アクションで非常によく似た操作を行うと、機能しません。

どこが間違っているのか誰にも教えてもらえますか?

4

1 に答える 1

2

あなたはいくつかの問題に直面しています。最も明白な問題は、Visual Studio 展開プロジェクトがカスタム アクションを誤ってスケジュールし、クライアント コンテキストを偽装することです。これは、UAC シナリオではアクセス許可がないことを意味します。簡単な回避策は、既に昇格されたコマンド プロンプト コンテキストから MSI を実行することです。

2 つ目の問題は、Visual Studio 展開プロジェクトが基になる MSI を抽象化/非表示にしすぎることです。カスタム アクションの場合、追加の設定を公開することなく、「インストール、アンインストール、ロールバック、コミット」のオプションのみが提供されます。ServiceInstall および ServiceControl テーブルを非表示にします。これにより、車輪を再発明するカスタム アクションを作成する必要があります。

カスタム アクションで行う必要があるのは、ビジネス ロジックの実行とプロパティの設定だけです。次に、Registry テーブルを使用して、プロパティに基づいてデータを設定する必要があります。このようにして、Windows インストーラーを可能な限り活用し、すべての無料のトランザクション/ロールバック機能を利用できます。

この問題は何度も繰り返されるため、Microsoft は VS2012 でセットアップ プロジェクト タイプを削除しました。

それが私のインストールだった場合、AppSearch/Reglocator を使用してデータを読み取り、最小限のカスタム アクションで処理を行い、レジストリ テーブルを使用してデータを適用するように設計をリファクタリングします。

そのためには、最低限、Windows インストーラー XML を調べて、このすべてのロジックを備え、既存のセットアップ プロジェクトにマージされるマージ モジュールを作成する必要があります。ただし、習得には時間がかかります。

于 2013-05-14T11:53:45.583 に答える