Как я могу найти идентификатор сайта IIS в C #? - PullRequest
10 голосов
/ 19 марта 2009

Я пишу класс установщика для моего веб-сервиса. Во многих случаях, когда я использую WMI (например, при создании виртуальных каталогов), я должен знать siteId, чтобы указать правильный путь метабазы ​​к сайту, например ::

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

Как я могу найти его программно в C #, основываясь на названии сайта (например, для "Веб-сайта по умолчанию")?

Ответы [ 5 ]

12 голосов
/ 19 марта 2009

Вот как получить его по имени. Вы можете изменить при необходимости.

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;
}
5 голосов
/ 19 марта 2009

Можно выполнить поиск сайта, проверив свойство 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 было использовано (IIS MMC принудительно использует его) и является уникальным.

3 голосов
/ 24 июля 2009
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;
        }
3 голосов
/ 19 марта 2009
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;
}
3 голосов
/ 19 марта 2009

Может быть, не самый лучший способ, но вот способ:

  1. перебрать все сайты в разделе "IIS: // имя_сервера / службы"
  2. для каждого из сайтов проверьте, является ли имя "Веб-сайт по умолчанию" в вашем случае
  3. если true, тогда у вас есть идентификатор вашего сайта

Пример:

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
...