38

我有一些实用方法,使用Microsoft.Web.Administration.ServerManager这些方法我一直遇到一些问题。出于说明目的,使用下面的死简单代码。

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

如果我将该代码直接放在控制台应用程序中并运行它,它将获取并列出 IIS express 网站。如果我从提升的命令提示符运行该应用程序,它将列出 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 的代码,不应该以提升的权限运行吗?显然不是?

谢谢您的帮助!

4

4 回答 4

61

确保添加对正确 Microsoft.Web.Administration 的引用,应该是位于 c:\windows\system32\inetsrv\ 下的 v7.0.0.0 看起来您正在添加对 IIS Express 的 Microsoft.Web 的引用.Administraton 会给你这种行为

于 2011-12-12T21:41:56.560 回答
12

您的问题帮助我找到了 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
于 2014-01-30T08:39:12.853 回答
6

警告!使用这种方法,我们看到了看似随机的问题,例如“不支持的操作”异常、添加/删除 HTTPS 绑定失败、在 IIS Express 中运行时无法启动/停止应用程序池以及其他问题。不知道这是由于 IIS 通常存在错误还是由于此处描述的非正统方法。总的来说,我的印象是所有用于自动化 IIS 的工具(appcmd、Microsoft.Web.Administration、PowerShell 等)都不稳定且不稳定,尤其是在不同的操作系统版本之间。良好的测试(一如既往)是可取的!

编辑:另请参阅对此答案的评论,了解为什么这种方法可能不稳定。

Microsoft.Web.Administration从 NuGet 安装的常规包工作正常。无需复制任何系统 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

于 2017-02-10T09:08:37.390 回答
1
var iisManager = new ServerManager(Environment.SystemDirectory + "\\inetsrv\\config\\applicationhost.config");

这完美地工作。无需更改任何参考

于 2019-03-07T07:26:15.373 回答