如何使用ServerManager从类库中读取IIS站点,而不是IIS表达式或升级进程如何处理类库?

问题描述 投票:35回答:4

我有一些使用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的代码,都应该以提升的权限运行吗?显然不是吗?

谢谢您的帮助!

c# iis-7 uac iis-express elevated-privileges
4个回答
57
投票

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


9
投票

您的问题帮助我找到了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

4
投票

警告!使用这种方法,我们看到了看似随机的问题,例如“不支持的操作”异常,无法添加/删除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


0
投票
var iisManager = new ServerManager(Environment.SystemDirectory + "\\inetsrv\\config\\applicationhost.config");

这非常有效。无需更改任何参考

© www.soinside.com 2019 - 2024. All rights reserved.