webdevqa.jp.net

管理者権限を必要とせずに、Vistaのポートで(HttpListenerまたはその他の.NETコードを使用して)リッスンできますか?

HttpListenerを使用して、ユーザーがユーザー定義のポートにプロキシを設定できるようにしています。 HttpListenerを起動すると、アプリケーションがVistaの管理者権限で実行されていない場合、例外が発生します。

私が読んだことから、 これは予想される動作です -ポートでの待機を開始するには管理者権限が必要です。しかし、管理者に昇格を要求せずにポートでリッスンするプログラム(Skypeなど)をたくさん実行しているので、これにはいくつかの方法があると確信しています。

HttpListenerでこれを行う方法はありますか?そうでない場合、.NETコードで他のAPI呼び出しを行ってポートを設定できますか?

38
Jon Galloway

私はHttpListenerを使用したことがありませんが、説明から、アプリケーションをサーバーのURL名前空間に埋め込むのではなく、通常のTCPポートでリッスンしたいようです(HttpListenerは通常のソケット関数(System.Net.Sockets.TcpListener)を使用して、TCPポートを管理者特権を必要とせずにリッスンすることができます。私はほぼ確実です。 SkypeはHttpListenerを使用しません。

10
Greg Hewgill

通常のTCP/IP(比較的単純)を使用して独自のHTTPサーバーを作成できますが、Windowsに追加されたHTTP.SYS機能を利用するHttpListenerを使用する方が簡単ですXP SP2。

ただし、HTTP.SYSはURL ACLの概念を追加します。これは、HTTP.SYSを使用すると、ポート80でサブ名前空間にバインドできるためです。TCP/ IPを使用すると、この要件は直接回避されますが、既に使用されているポートにバインドすることはできません。

Windows XPでは、HttpCfg.exeプログラムを使用して、特定のURLにバインドする権利をユーザーアカウントに付与するURL ACLを設定できます。 Platform SDKサンプルにあります。

Windows Vistaでは、HTTPCFGは引き続きサポートされていますが、機能はNETSHに吸収されています。

netsh http show urlacl

...既存のURL ACLのリストが表示されます。 ACLはSDDLで表現されます。

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes

... DOMURI\UserがリクエストをリッスンできるようにMyURI名前空間を設定します。

66
Roger Lipscombe

自分のコンピューターからのリクエストのみを処理する必要がある場合(通常はテスト目的で)、*の代わりにlocalhostをプレフィックスに記述できます。

たとえば、「http:// *:9669 /」の代わりに「http:// localhost:9669 /」と書くことができます。これはHttpListenerで正常に動作し、管理者権限は必要ありません(少なくともWindows 7では)。

22
Lu55

まあ私は似たようなことに対処する必要がありました。私のコンピュータは制限されたドメインにあるので、管理者権限がありません。いくつかの調査と読書の後、私はこのスレッドを見つけ、netshヒントにより、テストの開発のためだけに一時的なACLバインディングを使用するようになりました。私のコンピューターにはこれらのルールが存在します。

このエントリがあります:

「netsh http show urlacl」を実行します(上記を参照)。

    [...]
        Reservierte URL            : http://+:80/Temporary_Listen_Addresses/
            Benutzer: \Jeder
                Abhören: Yes
                Delegieren: No
                SDDL: D:(A;;GX;;;WD)
    [...]

したがって、HttpListenerを非管理者(Jeder)として使用できます。

    [...]
    HttpListener l = new HttpListener();
    string prefix = "http://+:80/Temporary_Listen_Addresses/";
    l.Prefixes.Add(prefix);
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
    [...]

これがこのスレッドを見つける人を助けますように。

7
rob

XPでは、最初にポートを開くためにコマンドライン(httpcfg)を使用する必要がありました。そうしないと、管理者以外では機能しません。

ここ を参照してください-このページでは問題を説明しています。下部に Zip があり、使用できるようになっています。

2
Marc Gravell