如何在C#中查找IIS站点ID?

时间:2009-03-19 16:14:03

标签: c# .net iis installer wmi

我正在为我的网络服务编写一个安装程序类。在许多情况下,当我使用WMI时(例如,在创建虚拟目录时),我必须知道siteId为站点提供正确的metabasePath,例如:

metabasePath is of the form "IIS://<servername>/<service>/<siteID>/Root[/<vdir>]"
for example "IIS://localhost/W3SVC/1/Root" 

如何根据网站名称(例如“默认网站”)以编程方式在C#中查找?

5 个答案:

答案 0 :(得分:12)

以下是如何按名称获取它。您可以根据需要进行修改。

public int GetWebSiteId(string serverName, string websiteName)
{
  int result = -1;

  DirectoryEntry w3svc = new DirectoryEntry(
                      string.Format("IIS://{0}/w3svc", serverName));

  foreach (DirectoryEntry site in w3svc.Children)
  {
    if (site.Properties["ServerComment"] != null)
    {
      if (site.Properties["ServerComment"].Value != null)
      {
        if (string.Compare(site.Properties["ServerComment"].Value.ToString(), 
                             websiteName, false) == 0)
        {
            result = int.Parse(site.Name);
            break;
        }
      }
    }
  }

  return result;
}

答案 1 :(得分:5)

您可以通过检查属于ServerComment IIS://Localhost/W3SVC SchemaClassName的配置数据库路径IIsWebServer的子级的string siteToFind = "Default Web Site"; // The Linq way using (DirectoryEntry w3svc1 = new DirectoryEntry("IIS://Localhost/W3SVC")) { IEnumerable<DirectoryEntry> children = w3svc1.Children.Cast<DirectoryEntry>(); var sites = (from de in children where de.SchemaClassName == "IIsWebServer" && de.Properties["ServerComment"].Value.ToString() == siteToFind select de).ToList(); if(sites.Count() > 0) { // Found matches...assuming ServerComment is unique: Console.WriteLine(sites[0].Name); } } // The old way using (DirectoryEntry w3svc2 = new DirectoryEntry("IIS://Localhost/W3SVC")) { foreach (DirectoryEntry de in w3svc2.Children) { if (de.SchemaClassName == "IIsWebServer" && de.Properties["ServerComment"].Value.ToString() == siteToFind) { // Found match Console.WriteLine(de.Name); } } } 属性来搜索网站。

以下代码演示了两种方法:

ServerComment

这假设已使用{{1}}属性(IIS MMC强制使用它)并且是唯一的。

答案 2 :(得分:3)

也许不是最好的方式,但这是一种方式:

  1. 遍历“IIS:// servername / service”
  2. 下的所有站点
  3. 为每个站点检查名称是否为“默认网站”
  4. 如果为true,那么您的网站ID为
  5. 示例:

    Dim oSite As IADsContainer
    Dim oService As IADsContainer
    Set oService = GetObject("IIS://localhost/W3SVC")
    For Each oSite In oService
        If IsNumeric(oSite.Name) Then
            If oSite.ServerComment = "Default Web Site" Then
                Debug.Print "Your id = " & oSite.Name
            End If
        End If
    Next
    

答案 3 :(得分:3)

private static string FindWebSiteByName(string serverName, string webSiteName)
{
    DirectoryEntry w3svc = new DirectoryEntry("IIS://" + serverName + "/W3SVC");
    foreach (DirectoryEntry site in w3svc.Children)
    {
        if (site.SchemaClassName == "IIsWebServer"
            && site.Properties["ServerComment"] != null
            && site.Properties["ServerComment"].Value != null
            && string.Equals(webSiteName, site.Properties["ServerComment"].Value.ToString(), StringComparison.OrdinalIgnoreCase))
        {
            return site.Name;
        }
    }

    return null;
}

答案 4 :(得分:3)

public static ManagementObject GetWebServerSettingsByServerComment(string serverComment)
        {
            ManagementObject returnValue = null;

            ManagementScope iisScope = new ManagementScope(@"\\localhost\root\MicrosoftIISv2", new ConnectionOptions());
            iisScope.Connect();
            if (iisScope.IsConnected)
            {
                ObjectQuery settingQuery = new ObjectQuery(String.Format(
                    "Select * from IIsWebServerSetting where ServerComment = '{0}'", serverComment));

                ManagementObjectSearcher searcher = new ManagementObjectSearcher(iisScope, settingQuery);
                ManagementObjectCollection results = searcher.Get();

                if (results.Count > 0)
                {
                    foreach (ManagementObject manObj in results)
                    {
                        returnValue = manObj;

                        if (returnValue != null)
                        {
                            break;
                        }
                    }
                }
            }

            return returnValue;
        }