5 Stimmen

Klonen / Duplizieren / Kopieren eines vorhandenen Anwendungspools in IIS 7

In PowerShell kann man einen vorhandenen IIS 7-Anwendungspool in einen neuen Anwendungspool klonen und dabei alle Einstellungen des Quellpools im neuen Pool beibehalten. Wie folgt...

import-module webadministration
copy IIS:\AppPools\AppPoolTemplate IIS:\AppPools\NewAppPool -force

Jetzt möchte ich dasselbe in C# tun, indem ich die Klassen im Namespace Microsoft.Web.Administration verwende. Ich habe den Namespace durchsucht und kann keinen einfachen Weg finden, um dies zu tun. Es gibt die MemberwiseClone-Methode, die ich aufrufen könnte, um eine oberflächliche Kopie des vorhandenen App-Pools zu erstellen, aber ich weiß nicht, ob dadurch alle Eigenschaften des Original-App-Pools dupliziert würden.

Kann mir jemand helfen?

3voto

John Fitzpatrick Punkte 4017

Ich habe bisher nur eine Möglichkeit gefunden, einen Anwendungspool in C# zu kopieren:

    private void creationizeAppPoolOldSchool(string strFullName)
    {
        RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); 
        Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); 
        runspace.Open(); 
        RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
        scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
        scriptInvoker.Invoke("import-module webadministration");
        string str = "copy IIS:\\AppPools\\_JANGO_FETT IIS:\\AppPools\\" + strFullName + " –force";
        scriptInvoker.Invoke(str);
    }

Weil mein wirkliches Bedürfnis darin besteht, eine Reihe vordefinierter Einstellungen auf allen neuen Anwendungspools zu haben, habe ich tatsächlich das Kopieren eines bestehenden Vorlagen-Pools aufgegeben und stattdessen einen Anwendungspool mit vordefinierten Einstellungen unter Verwendung von Microsoft.Web.Administration erstellt. Obwohl das nicht die ursprüngliche Frage ist, teile ich es trotzdem, weil jemand, der diesen Beitrag liest, auch daran interessiert sein könnte:

    public static void CreateCoCPITAppPool(string strName)
    {
        using (ServerManager serverManager = new ServerManager())
        {
            ApplicationPool newPool = serverManager.ApplicationPools.Add(strName);
            newPool.ManagedRuntimeVersion = "v4.0";
            newPool.AutoStart = true;
            newPool.ProcessModel.UserName = "Benutzername";
            newPool.ProcessModel.Password = "Passwort";
            newPool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
            newPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
            newPool.ProcessModel.IdleTimeout = TimeSpan.FromMinutes(10000); // .Zero;
            newPool.ProcessModel.ShutdownTimeLimit = TimeSpan.FromSeconds(3600);
            newPool.Failure.RapidFailProtection = false;
            serverManager.CommitChanges();
            IDictionary attr = newPool.Recycling.RawAttributes;
            foreach (KeyValuePair entry in attr)
            {
                // do something with entry.Value or entry.Key
                Console.WriteLine(entry.Key + " = " + entry.Value);
            }
            ConfigurationAttributeCollection coll = newPool.Recycling.Attributes;
            foreach (ConfigurationAttribute x in coll)
            {
                Console.WriteLine(x.Name + " = " + x.Value);
            }
        }
    }

1voto

DanM7 Punkte 2147

Ich bin mir nicht sicher über eine Kopiermethode, aber Sie könnten auf die Eigenschaften des aktuellen Anwendungspools zugreifen und dann einen neuen Anwendungspool mit denselben Eigenschaften erstellen:

// Wie man auf einen bestimmten Anwendungspool zugreift
DirectoryEntry appPools = new DirectoryEntry("IIS://" + serverName + "/w3svc/apppools", adminUsername, adminPassword);
foreach (DirectoryEntry AppPool in appPools.Children)
{
    if (appPoolName.Equals(AppPool.Name, StringComparison.OrdinalIgnoreCase))
    {
        // auf die Eigenschaften von AppPool zugreifen...
    }
}

Dann erstellen Sie einen neuen Pool in Ihrem Code, indem Sie die unten aufgeführte Methode aufrufen:

CreateAppPool("IIS://Localhost/W3SVC/AppPools", "MyAppPool");

Anwendungspool-Erstellungsmethode von MSDN:

static void CreateAppPool(string metabasePath, string appPoolName)
{
    //  metabasePath hat die Form "IIS:///W3SVC/AppPools"
    //    zum Beispiel "IIS://localhost/W3SVC/AppPools" 
    //  appPoolName hat die Form "", zum Beispiel "MyAppPool"
    Console.WriteLine("\nErstelle Anwendungspool namens {0}/{1}:", metabasePath, appPoolName);

    try
    {
        if (metabasePath.EndsWith("/W3SVC/AppPools"))
        {
            DirectoryEntry apppools = new DirectoryEntry(metabasePath);
            DirectoryEntry newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool");
            newpool.CommitChanges();
        }
        else
        {
            Console.WriteLine(" Fehler bei CreateAppPool; Anwendungspools können nur im */W3SVC/AppPools-Knoten erstellt werden.");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Fehler bei CreateAppPool mit folgender Ausnahme: \n{0}", ex.Message);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X