Jos*_*osh 35 c# iis-7 uac iis-express elevated-privileges
我有一些使用的方法,Microsoft.Web.Administration.ServerManager我一直有一些问题.使用以下死简单代码进行说明.
using(var mgr = new ServerManager())
{
foreach(var site in mgr.Sites)
{
Console.WriteLine(site.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将该代码直接放在控制台应用程序中并运行它,它将获取并列出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");
Run Code Online (Sandbox Code Playgroud)
显然我误解了"升级"过程的运行方式.不应该在升级过程中执行的所有操作,甚至是来自另一个dll的代码,都应该以提升的权限运行吗?显然不是吗?
谢谢您的帮助!
Car*_*res 57
请确保您添加的引用到正确的Microsoft.Web.Administration,应该是v7.0.0.0是位于C:\ WINDOWS\SYSTEM32\INETSRV \看起来要添加到IIS快递的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
Run Code Online (Sandbox Code Playgroud)
警告!使用这种方法,我们看到了一些看似随机的问题,例如“不受支持的操作”异常、无法添加/删除 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");
Run Code Online (Sandbox Code Playgroud)
即使您从 IIS Express 的应用程序池中执行上述操作,这也有效。您仍将看到“真实”IIS 的配置。您甚至可以添加新站点,只要您的应用程序以具有权限的用户身份运行即可。
但是请注意,上面的构造函数被记录为“仅供 Microsoft 内部使用”:
https://msdn.microsoft.com/en-us/library/ms617371(v=vs.90).aspx