¿Cómo puedo buscar el ID del sitio IIS en C #?

Estoy escribiendo una clase de instalador para mi servicio web. En muchos casos, cuando uso WMI (por ejemplo, al crear directorios virtuales), tengo que conocer el ID de sitio para proporcionar la ruta de metabase correcta al sitio, por ejemplo

metabasePath is of the form "IIS://///Root[/]" for example "IIS://localhost/W3SVC/1/Root" 

¿Cómo puedo buscarlo programáticamente en C #, según el nombre del sitio (por ejemplo, “Sitio web predeterminado”)?

Aquí es cómo conseguirlo por 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; } 

Puede buscar un sitio inspeccionando la propiedad ServerComment pertenece a los hijos de la ruta de la metabase IIS://Localhost/W3SVC que tiene un SchemaClassName de IIsWebServer .

El siguiente código demuestra dos enfoques:

 string siteToFind = "Default Web Site"; // The Linq way using (DirectoryEntry w3svc1 = new DirectoryEntry("IIS://Localhost/W3SVC")) { IEnumerable children = w3svc1.Children.Cast(); 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 ServerComment se ha utilizado (IIS MMC obliga a su uso) y es única.

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

Quizás no sea la mejor manera, pero aquí hay una forma:

  1. recorre todos los sitios bajo “IIS: // servername / service”
  2. para cada uno de los sitios, compruebe si el nombre es “Sitio web predeterminado” en su caso
  3. Si es verdad, entonces tienes tu ID de sitio

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