2010-10-14 5 views
4

J'essaie de créer une liste de tous les répertoires virtuels dans un site IIS. Cependant, j'ai trouvé qu'essayer de faire ceci varie considérablement dans les anciennes versions d'IIS. Dans IIS 7, il s'agit d'une tâche relativement simple via C# mais je n'arrive pas à trouver une bonne méthode pour cela dans IIS 6 et 5.Liste tous les répertoires virtuels dans IIS 5,6 et 7

J'ai essayé d'utiliser System.DirectoryServices.DirectoryEntry mais cela ne fonctionne pas. semblent me donner la sortie désirée. Je suis l'administrateur du serveur, donc je suis ouvert à l'utilisation d'autres choses comme les fichiers .vbs qui sont construits dans IIS ainsi que l'écriture de mon propre code.

+0

que je voulais faire quelque chose de similaire, mais de DOS: http://stackoverflow.com/q/13218046/589059 – rkagerer

Répondre

0

avez-vous essayé d'utiliser GetObject ("IIS: // ServerName/W3SVC")

vous le faites dans VBS comme ce

'Get the IIS Server Object 
Set oW3SVC = GetObject("IIS://ServerName/W3SVC/1/ROOT") 

For Each oVirtualDirectory In oW3SVC 

    Set oFile = CreateObject("Scripting.FileSystemObject") 
    Set oTextFile = oFile.OpenTextFile("C:\Results.txt", 8, True) 

    oTextFile.WriteLine(oVirtualDirectory.class + " -" + oVirtualDirectory.Name) 
    oTextFile.Close 

Next 
Set oTextFile = Nothing 
Set oFile = Nothing 

Wscript.Echo "Done" 

J'ai un article à ce sujet ici ->http://anyrest.wordpress.com/2010/02/10/how-to-list-all-websites-in-iis/

+0

Cette liste des sites web sous IIS. J'essaie d'obtenir tous les répertoires virtuels sous 1 site. – Avitus

+0

J'ai édité ma réponse pour qu'elle répertorie les répertoires et le type de répertoire. Espérons que cela fonctionne – Raymund

4

Voici deux exemples qui devraient fonctionner entre IIS 5, 6 et 7 (avec la compatibilité IIS 6 WMI installée). Je l'ai testé avec succès à la fois avec IIS 5 et 7.

VBScript version

Function ListVirtualDirectories(serverName, siteId) 
    Dim webSite 
    Dim webDirectory 

    On Error Resume Next 

    Set webSite = GetObject("IIS://" & serverName & "/W3SVC/" & siteId & "/ROOT") 
    If (Err <> 0) Then 
     Err = 0 
     Exit Function 
    Else 
     For Each webDirectory in webSite 
      If webDirectory.Class = "IIsWebVirtualDir" Then 
       WScript.Echo "Found virtual directory " & webDirectory.Name 
      End If 
     Next 
    End If 
End Function 

C# Version

void ListVirtualDirectories(string serverName, int siteId) 
{    
     DirectoryEntry webService = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteId + "/ROOT"); 

     foreach (DirectoryEntry webDir in webService.Children) 
     { 
      if (webDir.SchemaClassName.Equals("IIsWebVirtualDir")) 
       Console.WriteLine("Found virtual directory {0}", webDir.Name); 
     } 
} 
+0

Ceci est très utile. Cependant, il semble seulement obtenir les répertoires virtuels dans le dossier racine du site, pour obtenir tous les répertoires virtuels pour le site, je vais devoir le faire de manière récursive en allant dans les enfants des enfants et ainsi de suite, correct? – Despertar

+0

@Despertar Oui, vous devrez écrire une méthode récursive qui répète les enfants de chaque enfant. Cela devrait être assez simple à faire. Je mettrai à jour ma réponse pour le faire quand j'aurai un jour. – Garett

+1

J'ai fourni les méthodes d'assistance pour ce faire ci-dessous. Je sais que le temps n'est pas toujours facile à trouver. – Despertar

0

Je sais que vous vous demandez des solutions de VB, je ne VB sait vraiment, je suis plus d'une personne C#. Quoi qu'il en soit, voici un peu de code C# .NET pris à partir d'une application que j'ai écrit il y a quelque temps qui énumère les répertoires virtuels IIS ...

using System.DirectoryServices; 

    private DirectoryEntry _iisServer = null; 
    private DirectoryEntry iisServer 
    { 
     get 
     { 
      if (_iisServer == null) 
      { 
       string path = string.Format("IIS://{0}/W3SVC/1", serverName); 
       _iisServer = new DirectoryEntry(path); 
      } 
      return _iisServer; 
     } 
    } 

    private IDictionary<string, DirectoryEntry> _virtualDirectories = null; 
    private IDictionary<string, DirectoryEntry> virtualDirectories 
    { 
     get 
     { 
      if (_virtualDirectories == null) 
      { 
       _virtualDirectories = new Dictionary<string, DirectoryEntry>(); 

       DirectoryEntry folderRoot = iisServer.Children.Find("Root", VirDirSchemaName); 
       foreach (DirectoryEntry virtualDirectory in folderRoot.Children) 
       { 
        _virtualDirectories.Add(virtualDirectory.Name, virtualDirectory); 
       } 
      } 
      return _virtualDirectories; 
     } 
    } 

Espérons que vous serez en mesure d'obtenir l'idée générale de cela.

2

Voici deux fonctions auxiliaires à ajouter à la réponse Garetts. Avec ceux-ci, vous pouvez parcourir chaque domaine et obtenir tous ses répertoires virtuels, y compris ceux qui ne sont pas dans le dossier racine des domaines.

Obtenir ID du site du nom de domaine:

string GetSiteID(string domain) 
    { 
     string siteId = string.Empty; 

     DirectoryEntry iis = new DirectoryEntry("IIS://localhost/W3SVC"); 
     foreach (DirectoryEntry entry in iis.Children) 
      if (entry.SchemaClassName.ToLower() == "iiswebserver") 
       if (entry.Properties["ServerComment"].Value.ToString().ToLower() == domain.ToLower()) 
        siteId = entry.Name; 

     if (string.IsNullOrEmpty(siteId)) 
      throw new Exception("Could not find site '" + domain + "'"); 

     return siteId; 
    } 

obtenir toutes les entrées descendant (récursive) pour l'entrée du site

static DirectoryEntry[] GetAllChildren(DirectoryEntry entry) 
    { 
     List<DirectoryEntry> children = new List<DirectoryEntry>(); 
     foreach (DirectoryEntry child in entry.Children) 
     { 
      children.Add(child); 
      children.AddRange(GetAllChildren(child)); 
     } 

     return children.ToArray(); 
    } 

Mapping ID du site est pour un grand nombre de sites

Modifier: À l'arrière En testant ceci avec un serveur contenant plusieurs centaines de domaines, GetSiteID() fonctionne très lentement car il énumère tous les sites encore et encore pour obtenir l'identifiant. La fonction ci-dessous énumère les sites une seule fois et les met en correspondance avec leur identifiant et les stocke dans un dictionnaire. Ensuite, lorsque vous avez besoin de l'identifiant du site, vous le retirez du dictionnaire à la place, Sites ["domain"]. Si vous cherchez des répertoires virtuels pour tous les sites sur un serveur, ou une grande quantité, le ci-dessous sera beaucoup plus rapide que GetSiteID() ci-dessus.

public static Dictionary<string, string> MapSiteIDs() 
    { 
     DirectoryEntry IIS = new DirectoryEntry("IIS://localhost/W3SVC"); 
     Dictionary<string, string> dictionary = new Dictionary<string, string>(); // key=domain, value=siteId 
     foreach (DirectoryEntry entry in IIS.Children) 
     { 
      if (entry.SchemaClassName.ToLower() == "iiswebserver") 
      { 
       string domainName = entry.Properties["ServerComment"].Value.ToString().ToLower(); 
       string siteID = entry.Name; 
       dictionary.Add(domainName, siteID); 
      } 
     } 

     return dictionary; 
    } 
+0

Cool! Sauve moi le temps :) – Garett

Questions connexes