14

msi インストーラー パッケージで展開したい自己ホスト型の WCF サービス アプリケーションがあります。エンドポイントは http ポート 8888 を使用します。インストール後に Windows 2008 でプロジェクトを起動するには、プログラムを管理者として実行するか、netsh で http 設定を編集する必要があります。

"netsh http add urlacl url=http://+:8888/ user=\Everyone"

インストーラー クラスから http 設定を編集したいと考えています。したがって、Install() メソッドから次のメソッドを呼び出します。

    public void ModifyHttpSettings()
    {
        string parameter = @"http add urlacl url=http://+:8888/ user=\Everyone";

        System.Diagnostics.ProcessStartInfo psi =
            new System.Diagnostics.ProcessStartInfo("netsh", parameter);

        psi.Verb = "runas";
        psi.RedirectStandardOutput = false;
        psi.CreateNoWindow = true;
        psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        psi.UseShellExecute = false;
        System.Diagnostics.Process.Start(psi);
    }

この方法は、英語版の Windows では機能しますが、ローカライズ版では機能しません (ローカライズ版ではグループ Everyone の名前が異なります)。また、Environment.UserName を使用して、少なくとも現在ログオンしているユーザーにアクセスを許可しようとしました。ただし、インストーラー クラスはユーザー SYSTEM で実行される msi サービスによって実行されるため、これも機能しません。したがって、 Enviroment.UserName は SYSTEM を返しますが、それは私が望むものではありません。

すべての (または少なくとも現在ログオンしている) ユーザーに、msi インストーラー クラスからセルフホステッド WCF サービスへのアクセスを許可する方法はありますか?

4

1 に答える 1

25

解決策への私のアプローチ:

    public void ModifyHttpSettings()
    {
        string everyone = new System.Security.Principal.SecurityIdentifier(
            "S-1-1-0").Translate(typeof(System.Security.Principal.NTAccount)).ToString();

        string parameter = @"http add urlacl url=http://+:8888/ user=\" + everyone;

        ProcessStartInfo psi = new ProcessStartInfo("netsh", parameter);

        psi.Verb = "runas";
        psi.RedirectStandardOutput = false;
        psi.CreateNoWindow = true;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = false;
        Process.Start(psi);
    }

SID "S-1-1-0" は既知の SID であり、"Everyone" アカウントを表します。SID は、ウィンドウのすべてのローカライズで同じです。SecurityIdentifier クラスの Translate メソッドは、Everyone アカウントのローカライズされた名前を返します。

于 2010-03-26T10:27:02.703 に答える