5

IIS で Web サイト バインディングを一覧表示するコンソール アプリケーションが 1 つあります。

using (var directoryEntry = new DirectoryEntry("IIS://localhost/w3svc/" + GetWebSiteId())) {
    var bindings = directoryEntry.Properties["ServerBindings"]; 
}

プロセス経由で ASP.NET からこのコンソール アプリケーションを呼び出します

var process = new Process {
   StartInfo = new ProcessStartInfo {
       FileName = "c:/app.exe",
       Arguments = "check",
       UseShellExecute = false,
       RedirectStandardOutput = true,
       CreateNoWindow = true
    }
};

Widows 7 / IIS 7.5 の開発マシンではすべて正常に動作しますが、Windows 2012 / IIS 8 でテストすると、「アクセスが拒否されました」というエラーが表示されます。

エラーログ

"System.Runtime.InteropServices.COMException (0x80070005): Access is denied.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_IsContainer()
at System.DirectoryServices.DirectoryEntries.ChildEnumerator..ctor(DirectoryEntry container)
at System.DirectoryServices.DirectoryEntries.GetEnumerator()
at IISSubdomainManagement.Program.GetWebSiteId()
at IISSubdomainManagement.Program.TotalBindings()
at IISSubdomainManagement.Program.Main(String[] args)"

ps アプリケーション プール ID は「ApplicationPoolIdentity」です


言い忘れましたが、CMD から実行すると、サーバー上でコンソール アプリが正常に動作します。

4

4 に答える 4

2

にアクセスして実行するには、IUSR アカウントに許可を与える必要がありますC:\app.exeこのリンクは、適切なアカウントを見つけるために必要な情報を提供します。

于 2013-01-15T22:36:44.020 に答える
1

そのアプリケーション プールに実際に対応する仮想アカウントではなく、「ApplicationPoolIdentity」に権限を付与した可能性があります。Microsoft の説明を読むか、仮想 ID IIS などをオンラインで検索します。

開発マシンでは、おそらく何らかの完全な管理者権限を持っているため、それほど制限されていません。

その後も問題が解決しない場合は、Process Monitorを実行してエラーを再現することをお勧めします。これにより、どのプロセスがどの ID でどのリソースにアクセスしているかを正確に確認できます。ただし、本番環境で Process Monitor を実行するよりも、開発マシンで問題を再現することをお勧めします。それを効率的に実行するには、少し学習が必要です。

于 2013-01-15T22:51:17.797 に答える