web-dev-qa-db-ja.com

Windows Server 2012、アプリケーションはポートを開くための管理アクセスを必要とします

管理者として実行したりUACを無効にしたりせずに、特定の1つのポートでリッスンするアクセスをアプリケーションに許可するにはどうすればよいですか?

ポリシーごとに、古いサーバー(Windows Server 2003)からWindows Server 2012に移行する必要がありました。

このサーバーの主な目的は、特定の(非標準の)ポートでリッスンし、リクエストに応答するサードパーティアプリを実行することです。 (Windowsサービスではないため、手動で実行する必要があります。)

古いサーバーでは、ファイアウォールがそのポートを開くことができるように設定されている限り、古いユーザーと同じように正常に動作しました。 2012では、ファイアウォールを許可するように構成されていても、ポートを開くことができるようにするには、管理者として実行する必要があります。

セキュリティ上の理由から、これの必要性は理解しています(任意のユーザーは、ログインアクセスがあっても、サーバー上の任意のポートを開くことができないはずです)が、本当にそのアクセスを許可する必要がある場合はどうなりますか?

注:アプリケーションを管理者として実行したくありません。 UACを無効にしたくありません。すべてのセキュリティ対策を維持したいのですが、この1つのアプリケーション(独自のユーザーアカウントを持つことができます)がポートを開いてリッスンできるようにするだけです。

有望な検索語をいくつか検索しましたが、Windows Server 2012が独自のサービスに必要とするポートに関する情報しか得られませんでした。

[〜#〜] edit [〜#〜]アプリケーションに関する詳細情報。それは単にbind()listen()accept()を含む単純なWinsockを使用します。 HTTPListenerのようなWindowsサービスは使用しません。では、通常のユーザーとして実行したときにソケットが開かない原因を追跡するにはどうすればよいですか?

3
Snowbody

OPがより多くの情報を提供したため編集:

TCPポートをリッスンする場合、管理者権限は必要ありません。ただし、HTTPListenerなどの一部のヘルパーは管理者権限を必要とします。その場合、予約を構成して、ユーザーがそのポートでリッスンできるようにします。

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

https://msdn.Microsoft.com/en-us/library/ms733768.aspx?f=255&MSPPError=-2147217396

あなたのケースでは、winsockを使用して、ポートへのバインディングがUACをトリガーしていないか、管理者権限を要求していません。それは別のものです。パーミッションの問題になると、絶対に大好きなツールは SysinternalのProcess Monitor !です。

フィルターを追加(CTRL + L)「結果はアクセス拒否されました」。これにより、パスにアクセスしようとするすべてのプロセスが表示されますが、プロセスには権限がありません。フィルターをいじって問題を絞り込むことができます。

6
Daniel