2009-03-19 16 views
10

Estoy escribiendo una clase de instalador para mi servicio web. En muchos casos cuando uso de WMI (por ejemplo al crear directorios virtuales) Tengo que saber la SiteID para proporcionar la Metabasepath correcta al sitio, por ejemplo:¿Cómo puedo buscar el ID de sitio de IIS en C#?

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

¿Cómo puedo mirar hacia arriba mediante programación en C#, con base en el nombre del sitio (por ejemplo, "Sitio web predeterminado")?

Respuesta

12

Aquí se explica cómo obtenerlo por su nombre. Puede modificar según sea necesario.

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; 
} 
+2

En mi sistema me tuvieron que actualizar el anterior con la siguiente para que se compile "número = Convert.ToInt32 (site.Name);" – MattH

3
Tal vez no

la mejor manera, pero aquí es una manera:

  1. recorrer todos los sitios bajo "IIS: // servidor/servicio"
  2. para cada uno de los sitios de comprobar si el nombre es "sitio web predeterminado" en su caso
  3. si es cierto, entonces tienen su sitio Identificación del

Ejemplo:

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 
5

Puede buscar un sitio mediante la inspección de la ServerComment propiedad que pertenece a los niños de la ruta de la metabase IIS://Localhost/W3SVC que tienen un SchemaClassName de IIsWebServer.

El código siguiente muestra dos enfoques:

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); 
     } 
    } 
} 

Esto supone que la propiedad se ha utilizado ServerComment (IIS fuerzas MMC su usado) y es único.

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; 
} 
+0

La cadena devuelta se puede analizar como int si es necesario. Supongo que, en la mayoría de los casos, no es necesario que se devuelva como 'int', ya que se usará para crear un URI. – CodeMonkeyKing

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; 
     } 
+0

¿Funciona con la versión de IIS <7? Lamentablemente estoy atascado con Win2k3 – Grzenio

+0

Este método funciona para IIS6. Lo usé para encontrar grupos de aplicaciones. – Helephant

+0

@Helephant, ¿dónde encontrar aplicaciones utilizando este método? en IIS 6? – Kiquenet

Cuestiones relacionadas