41

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

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

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

4

5 に答える 5

69

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

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

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

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

netsh http show urlacl

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

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

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

于 2008-10-12T09:03:02.210 に答える
24

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

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

于 2011-03-23T16:24:26.140 に答える
9

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

于 2008-10-04T07:58:52.120 に答える
9

まあ、私は似たようなものに対処しなければなりませんでした。私のコンピューターは制限付きドメインにあるため、管理者権限がありません。いくつかの調査と読書の後、私はこのスレッドを見つけ、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"
    [...]

これが、このスレッドを見つけた人に役立ちますように。

于 2011-07-12T12:00:16.030 に答える
2

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

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

于 2008-10-04T08:45:24.350 に答える