2009-03-19 9 views
10

Ich schreibe eine Installer-Klasse für meinen Web-Service. In vielen Fällen, wenn ich WMI (zB beim Erstellen von virtuellen Verzeichnissen) Ich habe die SITEID kennen die richtige Metabasepath auf der Website zur Verfügung zu stellen, zum Beispiel:Wie kann ich die IIS-Site-ID in C# nachschlagen?

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

Wie kann ich es so aussehen programmatisch in C#, bezogen auf der Name der Site (zB für "Default Web Site")?

Antwort

12

Hier ist, wie Sie es mit Namen bekommen. Sie können nach Bedarf ändern.

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

Auf meinem System hatte ich das oben mit dem folgenden zu aktualisieren, um es zu kompilieren "result = Convert.ToInt32 (site.Name);" – MattH

3

Vielleicht nicht der beste Weg, aber hier ist eine Art und Weise:

  1. Schleife durch alle Websites unter „IIS: // servername/service“
  2. für jede der Websites überprüfen, ob der Name "Default Web Site" in Ihrem Fall
  3. wenn sie wahr ist, dann haben Sie Ihre Website-ID

Beispiel:

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

Sie können durch Überprüfen der ServerComment Eigentum gehört Kinder des Metabasispfad für eine Website suchen, die eine IIS://Localhost/W3SVCSchemaClassName von IIsWebServer haben.

Der folgende Code zeigt zwei Ansätze:

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

Dies setzt voraus, dass die ServerComment Eigenschaft verwendet worden ist (IIS MMC Kräfte seine verwendet) und ist einzigartig.

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

Die zurückgegebene Zeichenfolge kann als int interpretiert werden, wenn dies erforderlich ist. Meine Vermutung ist, dass Sie es in den meisten Fällen nicht wirklich als 'int' zurückgeben müssen, da Sie es verwenden werden, um einen URI zu erstellen. – 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

Funktioniert es mit IIS-Version <7? Leider bin ich mit Win2k3 stecken – Grzenio

+0

Diese Methode funktioniert für IIS6. Ich habe es verwendet, um App-Pools zu finden. – Helephant

+0

@Helephant, wo finden Apppools mit dieser Methode? in IIS 6 ?? – Kiquenet