【问题标题】:Control IIS 7 server from Windows 2003 server programmatically以编程方式从 Windows 2003 服务器控制 IIS 7 服务器
【发布时间】:2011-03-31 01:28:09
【问题描述】:

我们使用 Windows 2003 服务器运行各种作业。其中一些作业将应用程序池命令发送到运行 IIS 6 的 Web 服务器(回收、启动、停止)。现在我们有一个运行 IIS 7 的 Windows 2008 Web 服务器,我们想要发送相同的命令。这一切都是使用 C# 完成的。

这是我们用来为 IIS 6 发送命令的代码:

var methodToInvoke = "Stop"; // could be "Stop", "Start", or "Recycle"
var co = new ConnectionOptions
{
   Impersonation = ImpersonationLevel.Impersonate,
   Authentication = AuthenticationLevel.PacketPrivacy
};

var objPath = string.Format("IISApplicationPool.Name='W3SVC/AppPools/{0}'", appPoolName);
var scope = new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISV2", machineName), co);

using (var mc = new ManagementObject(objPath))
{
   mc.Scope = scope;
   mc.InvokeMethod(methodToInvoke, null, null);
}

由于底层更改,此代码不适用于 IIS 7,因此我们目前正在尝试:

using (ServerManager serverManager = ServerManager.OpenRemote(machineName))
{
   var appPool = serverManager.ApplicationPools[appPoolName];
   if (appPool != null)
   {
      appPool.Stop(); // or app.Start() or app.Recycle()
      serverManager.CommitChanges();
   }
}

上面的代码在我的工作站上运行良好,该工作站运行 Windows 7(以及 IIS 7.5)。但是,当我将此代码部署到我们的应用程序服务器时,它不起作用。它得到这个错误:

System.InvalidCastException: 
Unable to cast COM object of type 'System.__ComObject' to interface type 
'Microsoft.Web.Administration.Interop.IAppHostWritableAdminManager'. 
This operation failed because the QueryInterface call on the COM component for the 
interface with IID '{FA7660F6-7B3F-4237-A8BF-ED0AD0DCBBD9}' failed due to the following error: 
Interface not registered (Exception from HRESULT: 0x80040155).   

根据我的研究,这是因为 IIS 7 在 Windows Server 2003 服务器上不可用。 (我确实包含了 Microsoft.Web.Administration.dll 文件。)

所以我的问题是:

  1. 上面的 IIS 7 代码是否可以在 Windows 2003 服务器上运行?
  2. 如果对#1 不满意,有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# iis iis-7 windows-server-2008 windows-server-2003


    【解决方案1】:

    Microsoft.Web.Administration,它依赖于框架 4 提供的 System.Web.dll,而不是客户端配置文件。

    【讨论】:

    • 这不能回答问题。
    【解决方案2】:

    尝试使用 DirectoryEntry 控制 IIS 池。

    查看此主题: Check the status of an application pool (IIS 6) with C#

    【讨论】:

      【解决方案3】:

      从四处阅读看来,它似乎无法满足您的需求。仅包含 dll 文件是不够的。 根据http://forums.iis.net/t/1149274.aspx..

      要使用 Microsoft.Web.Administration,您需要安装 IIS,至少需要安装通过安装管理工具获得的配置 API。

      不幸的是,没有 SDK 可以实现这一点,并且它对其他组件有几个依赖项,这些组件不允许您将其带到另一台机器上并使其工作(例如 COM 对象、DLL 等)。

      我很想知道您是否找到了解决方法。

      谢谢

      【讨论】:

      • 我最终在 Web 服务器本身上创建了一个 Web 服务,该服务将启动/停止/回收该服务器上的应用程序池。此 Web 服务显然需要位于一个单独的应用程序池中,而不是它将更新的应用程序池。这不是一个非常安全的解决方案,但我正在使用内部网络服务器。
      • 遇到了同样的问题,您的帖子证实了我所担心的——管理 API 在 Windows XP 上不起作用。感谢您的帖子
      猜你喜欢
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2023-03-10
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多