Iis 使用Microsoft.Web.Administration获取远程应用程序池状态

Iis 使用Microsoft.Web.Administration获取远程应用程序池状态,iis,dns,pool,Iis,Dns,Pool,我正在尝试使用Microsoft.Web.Administration API获取IIS 7.5应用程序池的状态,但出现异常: System.Runtime.InteropServices.COMException was unhandled ErrorCode=-2147020584 HResult=-2147020584 Message=The object identifier does not represent a valid object. (Exception from

我正在尝试使用Microsoft.Web.Administration API获取IIS 7.5应用程序池的状态,但出现异常:

System.Runtime.InteropServices.COMException was unhandled
  ErrorCode=-2147020584
  HResult=-2147020584
  Message=The object identifier does not represent a valid object. (Exception from HRESULT: 0x800710D8)
  Source=Microsoft.Web.Administration
我使用以下代码连接到不同域中的远程计算机:

string appHostConfigFile = "\\\\" + serverName + "\\c$\\windows\\system32\\inetsrv\\config\\applicationHost.config";
UNCAccess unc = new UNCAccess(@"\\" + serverName + "\\c$\\windows\\system32\\inetsrv\\config", <USER_NAME>, <DOMAIN>, <PASSWORD>);
server = new ServerManager(appHostConfigFile);
现在,奇怪的是,我确实正确地获得了Name属性(以及许多其他属性),但是State属性认为是一个例外。 只有当我尝试连接到本地机器(127.0.0.1)时,一切都按预期进行

有人能告诉我我错过了什么吗?有没有其他方法可以连接到我的域之外的机器上的远程IIS服务器


非常感谢

我已成功使用Windows模拟,使用
ServerManager
访问远程IIS实例

using (ServerManager serverManager = new ServerManager($@"\\{computerName}\c$\windows\system32\inetsrv\config\applicationHost.config"))
{
    ApplicationPoolCollection appPools = serverManager.ApplicationPools
}

这适用于IIS 8和IIS 7.5。我没有使用其他版本进行测试。我使用的是SimpleImpersonation(可通过Nuget获得)。

您应该使用服务器管理器的构造函数,该构造函数将服务器名称作为参数,而不是这个要求文件路径的构造函数。是的,但问题是,应该将服务器名称作为参数的ServerManager.OpenRemote(serverName)函数不接受凭据,所以我不能真正使用它。我必须连接到另一个域中的计算机,因此我必须使用身份验证。MWA依赖相关接口来管理远程计算机,您必须适应其限制。您的方法只向它公开配置文件,这是无用的,因为在这种情况下,MWA假定该文件是“本地”的,而不是远程的,这导致了您观察到的问题。您可以尝试查看IIS PowerShell cmdlet+PowerShell远程处理是否是更好的选择。经过大量研究,我得出了相同的结论。配置文件解决方案仅适用于配置数据,这就是为什么我不能以这种方式读取池的状态。OpenRemote功能仅限于域内(无身份验证),因此最终我明白我别无选择。如果它能工作,那就太好了。想提供完整的解决方案吗?在您的代码片段中,我没有看到任何对SimpleImpersonation的引用。SimpleImpersonation只是包装这段代码。您必须阅读他们的文档,看看如何做,因为自从我将其与上述代码一起使用以来,它发生了变化。
using (ServerManager serverManager = new ServerManager($@"\\{computerName}\c$\windows\system32\inetsrv\config\applicationHost.config"))
{
    ApplicationPoolCollection appPools = serverManager.ApplicationPools
}