2009-03-20 8 views
7

Je dois supprimer un répertoire virtuel et un pool d'applications de .NET dans le cadre de ma méthode de désinstallation. J'ai trouvé le code suivant sur le web quelque part:Comment puis-je supprimer des objets IIS de C#?

private static void DeleteTree(string metabasePath) 
    { 
     // metabasePath is of the form "IIS://<servername>/<path>" 
     // for example "IIS://localhost/W3SVC/1/Root/MyVDir" 
     // or "IIS://localhost/W3SVC/AppPools/MyAppPool" 
     Console.WriteLine("Deleting {0}:", metabasePath); 

     try 
     { 
      DirectoryEntry tree = new DirectoryEntry(metabasePath); 
      tree.DeleteTree(); 
      tree.CommitChanges(); 
      Console.WriteLine("Done."); 
     } 
     catch (DirectoryNotFoundException) 
     { 
      Console.WriteLine("Not found."); 
     } 
    } 

mais il semble jeter un COMException sur tree.CommitChanges();. Ai-je besoin de cette ligne? Est-ce une approche correcte?

+1

Pouvez-vous coller la COMException complète? – Kev

+0

Vous devriez vraiment utiliser l'installateur Windows pour faire ce genre de choses. Wix intègre des fonctions permettant de créer et de supprimer automatiquement les objets IIS. –

+0

@Jesse - En utilisant Wix, pouvez-vous demander aux utilisateurs de créer un nouveau pool d'applications/site Web/vdir plutôt que de choisir ceux qui existent déjà (le projet VS Web Setup vous permet uniquement de sélectionner des objets IIS existants)? – Kev

Répondre

6

Si vous supprimez des objets tels que des pools d'applications, des répertoires virtuels ou des applications IIS, vous devez le faire comme ceci:

string appPoolPath = "IIS://Localhost/W3SVC/AppPools/MyAppPool"; 
using(DirectoryEntry appPool = new DirectoryEntry(appPoolPath)) 
{ 
    using(DirectoryEntry appPools = 
       new DirectoryEntry(@"IIS://Localhost/W3SVC/AppPools")) 
    { 
     appPools.Children.Remove(appPool); 
     appPools.CommitChanges(); 
    } 
} 

Vous créez un objet DirectoryEntry pour l'élément que vous souhaitez supprimer puis créer un DirectoryEntry pour son parent. Vous dites ensuite au parent de supprimer cet objet.

Vous pouvez aussi le faire ainsi:

string appPoolPath = "IIS://Localhost/W3SVC/AppPools/MyAppPool"; 
using(DirectoryEntry appPool = new DirectoryEntry(appPoolPath)) 
{ 
    using(DirectoryEntry parent = appPool.Parent) 
    { 
     parent.Children.Remove(appPool); 
     parent.CommitChanges(); 
    } 
} 

En fonction de la tâche à la main, je vais utiliser les deux méthodes.

+0

est-il un moyen facile d'obtenir le parent, quand j'ai l'enfant DirectoryEntry? appPool.Parent fonctionnerait? – Grzenio

+0

appPool.Parent fonctionnera bien. – Kev

+0

problème de boîtier mineur avec "appPoolpath" vrs "appPoolPath". autre que cette excellente réponse – Simon