2009-03-20 5 views
7

Ich muss einen virtuellen Verzeichnis- und Anwendungspool von .NET als Teil meiner Deinstallationsmethode löschen. Ich fand den folgenden Code auf dem Netz irgendwo:Wie kann ich IIS-Objekte aus C# löschen?

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

aber es scheint ein COMException auf tree.CommitChanges(); zu werfen. Brauche ich diese Linie? Ist es ein richtiger Ansatz?

+1

Können Sie die vollständige COMException einfügen? – Kev

+0

Sie sollten wirklich den Windows-Installer verwenden, um diese Art von Dingen zu tun. Wix verfügt über integrierte Funktionen zum automatischen Erstellen und Entfernen von IIS-Objekten. –

+0

@Jesse - Mit Wix können Sie Benutzer zu einem neuen App-Pool/Website/vdir auffordern, anstatt vorhandene zu wählen (das VS Web Setup-Projekt lässt Sie nur vorhandene IIS-Objekte auswählen)? – Kev

Antwort

6

Wenn Sie Objekte wie Anwendungspools, virtuelle Verzeichnisse oder IIS-Anwendungen zu löschen, müssen Sie es wie dies zu tun:

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

Sie erstellen ein DirectoryEntry Objekt für das Element, das Sie dann löschen möchten erstellen a DirectoryEntry für seine Eltern. Sie sagen dann dem Eltern, dieses Objekt zu entfernen.

Sie können dies auch tun, wie gut:

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

Je nach Aufgabe in der Hand werde ich entweder Methode verwenden.

+0

gibt es einen einfachen Weg, um die Eltern zu bekommen, wenn ich das Kind DirectoryEntry habe? appPool.Parent würde funktionieren? – Grzenio

+0

appPool.Parent wird gut funktionieren. – Kev

+0

kleinere Gehäuseproblem mit "appPoolpath" vrs "appPoolPath". andere als die große Antwort – Simon