我有一些使用Microsoft.Web.Administration.ServerManager
的实用方法,我一直有一些问题。使用以下死简单代码进行说明。
using(var mgr = new ServerManager())
{
foreach(var site in mgr.Sites)
{
Console.WriteLine(site.Name);
}
}
如果我将该代码直接放在控制台应用程序中并运行它,它将获取并列出IIS快速网站。如果我从提升的命令提示符运行该应用程序,它将列出IIS7网站。有点不方便,但到目前为止还不错。
如果我将该代码放在由控制台应用程序引用和调用的类库中,它将始终列出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的代码,都应该以提升的权限运行吗?显然不是吗?
谢谢您的帮助!
确保您正在添加对正确的Microsoft.Web.Administration的引用,应该是位于c:\ windows \ system32 \ inetsrv \下的v7.0.0.0。看起来您正在添加对IIS Express的Microsoft.Web的引用.Administraiton会给你这种行为
您的问题帮助我找到了PowerShell的答案,因此如果Internet正在搜索如何执行此操作:
$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
警告!使用这种方法,我们看到了看似随机的问题,例如“不支持的操作”异常,无法添加/删除HTTPS绑定,在IIS Express中运行时无法启动/停止应用程序池以及其他问题。目前尚不清楚这是由于IIS通常是错误还是由于此处描述的非正统方法。总的来说,我的印象是所有用于自动化IIS的工具(appcmd,Microsoft.Web.Administration,PowerShell,...)都很不稳定,特别是在不同的操作系统版本中。良好的测试(一如既往)是可取的!
从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
var iisManager = new ServerManager(Environment.SystemDirectory + "\\inetsrv\\config\\applicationhost.config");
这非常有效。无需更改任何参考