2009-03-19 5 views
10

J'écris une classe d'installateur pour mon service Web. Dans de nombreux cas lors de l'utilisation WMI (par exemple lors de la création des répertoires virtuels) Je dois connaître le siteId de fournir la Metabasepath correcte sur le site, par exemple:Comment puis-je rechercher l'ID de site IIS en C#?

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

Comment puis-je le chercher par programme en C#, sur la base le nom du site (par exemple pour "Site Web par défaut")?

Répondre

12

Voici comment l'obtenir par son nom. Vous pouvez modifier au besoin.

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

Sur mon système, je dû mettre à jour ce qui précède avec ce qui suit pour le compiler « résultat = Convert.ToInt32 (site.Name); » – MattH

3

Peut-être pas la meilleure façon, mais voici une façon:

    boucle
  1. à travers tous les sites sous « IIS: // servername/service »
  2. pour chacun des sites vérifier si le nom est "site Web par défaut" dans votre cas
  3. si cela est vrai, alors vous avez votre identifiant du site

Exemple:

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

Vous pouvez rechercher un site en examinant la propriété ServerComment appartenant aux enfants du chemin de métabase IIS://Localhost/W3SVC qui ont une SchemaClassName de IIsWebServer.

Le code suivant illustre deux approches:

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

Cela suppose que la propriété ServerComment a été utilisé (IIS forces MMC) et son utilisée est unique.

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 chaîne retournée peut être analysée comme un int si cela est nécessaire. Ma conjecture est que dans la plupart des cas vous n'avez pas vraiment besoin d'être retourné comme un 'int' comme vous l'utiliserez pour faire 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

Fonctionne-t-il avec la version IIS <7? Malheureusement, je suis coincé avec Win2k3 – Grzenio

+0

Cette méthode fonctionne pour IIS6. Je l'ai utilisé pour trouver des pools d'applications. – Helephant

+0

@Helephant, où trouver des apppools en utilisant cette méthode ?? dans IIS 6 ?? – Kiquenet