web-dev-qa-db-ja.com

ServerManagerを使用してIISサイトではなく、IISエクスプレス、クラスライブラリからOR昇格したプロセスがクラスを処理する方法ライブラリ?

私はいくつかの問題を抱えているMicrosoft.Web.Administration.ServerManagerを使用するユーティリティメソッドをいくつか持っています。説明のために、次の完全に単純なコードを使用します。

using(var mgr = new ServerManager())
{
    foreach(var site in mgr.Sites)
    {
        Console.WriteLine(site.Name);
    }
}

そのコードをコンソールアプリケーションに直接配置して実行すると、IIS Express Webサイトが取得されて一覧表示されます。昇格されたコマンドプロンプトからそのアプリを実行すると、IIS7 Webサイトが一覧表示されます。少し不便ですが、これまでのところとても良いです。

代わりに、コンソールアプリによって参照および呼び出されるクラスライブラリにそのコードを配置すると、コンソールアプリが昇格されている場合でも、常にIIS Expressサイトが一覧表示されます。

グーグルは私に次のことを試みさせました、運がありません。

//This returns IIS express
var mgr = new ServerManager();
//This returns IIS express
var mgr = ServerManager.OpenRemote(Environment.MachineName);
//This throws an exception
var mgr = new  ServerManager(@"%windir%\system32\inetsrv\config\applicationhost.config");

明らかに、「高度な」プロセスの実行方法について何かを誤解しました。昇格されたプロセスで実行されるすべてのものが、別のdllからのコードでさえ、昇格された権限で実行されるべきではありませんか?明らかにそうではありませんか?

助けてくれてありがとう!

35
Josh

正しいMicrosoft.Web.Administrationへの参照を追加していることを確認します。c:\ windows\system32\inetsrv \にあるv7.0.0.0である必要があります。IIS ExpressのMicrosoft.Web.Administraitonはその動作を提供します

58

あなたの質問は、PowerShellの答えを見つけるのに役立ちました。そのため、インターネットがその方法を探しているなら、

$Assembly = [System.Reflection.Assembly]::LoadFrom("$env:systemroot\system32\inetsrv\Microsoft.Web.Administration.dll")

# load IIS express
$iis = new-object Microsoft.Web.Administration.ServerManager 
$iis.Sites

# load IIS proper
$iis = new-object Microsoft.Web.Administration.ServerManager "$env:systemroot\system32\inetsrv\config\applicationhost.config"  
$iis.Sites
9
Richard

注意!このアプローチを使用すると、「サポートされていない操作」の例外、HTTPSバインディングの追加/削除の失敗、IIS Expressでの実行時のアプリケーションプールの開始/停止の失敗、その他の問題など、一見ランダムな問題が発生します。これがIISが一般的にバグを含んでいるためか、ここで説明されている非正統的なアプローチのためかは不明です。一般に、私の印象は、IISを自動化するためのすべてのツール(appcmd、Microsoft.Web.Administration、PowerShellなど)は、特に異なるOSバージョン間では不安定で不安定であるということです。 (いつものように)良いテストをお勧めします!

NuGetからインストールされた通常のMicrosoft.Web.Administrationパッケージは正常に動作します。システムDLLをコピーする必要はありません。

公式ドキュメントからの明白な解決策もうまくいきます:

ServerManager iisManager = new ServerManager(@"C:\Windows\System32\inetsrv\config\applicationHost.config");

これは、IIS Expressのアプリケーションプール内から上記を実行した場合でも機能します。 「実際の」IISの構成は引き続き表示されます。新しいサイトを追加することもできますが、それを行う権限を持つユーザーとしてアプリケーションを実行できます。

ただし、上記のコンストラクターは「Microsoft内部使用のみ」として文書化されていることに注意してください。

https://msdn.Microsoft.com/en-us/library/ms617371(v = vs.90).aspx

4
Florian Winter
var iisManager = new ServerManager(Environment.SystemDirectory + "\\inetsrv\\config\\applicationhost.config");

これは完全に機能します。参照を変更する必要はありません

0
arlak