2012-09-28 14 views
5

En PowerShell, se puede clonar un grupo de aplicaciones de IIS 7 existente en un nuevo grupo de aplicaciones, conservando todas las configuraciones de grupos de origen en el grupo nuevo. Así ...Clonar/Duplicar/Copiar un grupo de aplicaciones existente en IIS 7

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

Ahora me gustaría hacer lo mismo en C# usando las clases del espacio de nombres Microsoft.Web.Administration. He navegado por el espacio de nombres y no puedo encontrar una manera de hacerlo fácilmente. Existe el método MemberwiseClone que podría llamar para crear una copia superficial del grupo de aplicaciones existente, pero no sé si eso duplicaría todas las propiedades de los grupos de aplicaciones originales.

¿Alguien puede ayudar?

+0

¿Alguna vez descubrió una forma de hacerlo? – DanM7

+0

@Dan Maguire, lo siento no, no exactamente. La única respuesta que recibí hasta ahora no resuelve completamente el problema. No trata cómo obtener las propiedades de la AppPool en la primera sección del conjunto recién creado en la segunda sección. Por el momento, estoy considerando llamar al código de PowerShell directamente dentro de mi programa C#. Tengo un par de semanas antes de la fecha límite para resolver esto. Publicaré cualquier solución que elija una vez que lo haga. –

Respuesta

3

he encontrado una sola manera en lo que va a copiar un grupo de aplicaciones en C#:

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

Debido a que mi verdadera necesidad es tener un conjunto de ajustes predefinidos en todos los nuevos grupos de aplicaciones, de hecho me abandoné la copia de una plantilla existente grupo y en su lugar crear un grupo de aplicaciones con configuraciones predefinidas usando Microsoft.Web.Administration. Aunque esa no es la pregunta original, la comparto porque a alguien que navega en esta publicación también le puede interesar:

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 = "username"; 
      newPool.ProcessModel.Password = "password"; 
      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<string, string> attr = newPool.Recycling.RawAttributes; 
      foreach (KeyValuePair<String, String> 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); 
      } 
     } 
    } 
1

no estoy seguro acerca de un método de copia, pero se puede acceder a las propiedades del grupo de aplicación actual y luego crear un nuevo grupo de aplicación con las mismas propiedades:

// How to access a specific app pool 
DirectoryEntry appPools = new DirectoryEntry("IIS://" + serverName + "/w3svc/apppools", adminUsername, adminPassword); 
foreach (DirectoryEntry AppPool in appPools.Children) 
{ 
    if (appPoolName.Equals(AppPool.Name, StringComparison.OrdinalIgnoreCase)) 
    { 
     // access the properties of AppPool... 
    } 
} 

A continuación, se crea una nueva piscina en su código llamando al método enumeran a continuación:

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

App método de creación de la piscina desde MSDN:

static void CreateAppPool(string metabasePath, string appPoolName) 
{ 
    // metabasePath is of the form "IIS://<servername>/W3SVC/AppPools" 
    // for example "IIS://localhost/W3SVC/AppPools" 
    // appPoolName is of the form "<name>", for example, "MyAppPool" 
    Console.WriteLine("\nCreating application pool named {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(" Failed in CreateAppPool; application pools can only be created in the */W3SVC/AppPools node."); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Failed in CreateAppPool with the following exception: \n{0}", ex.Message); 
    } 
} 
Cuestiones relacionadas