2012-09-28 8 views
5

In PowerShell è possibile clonare un pool di applicazioni IIS 7 esistente in un nuovo pool di applicazioni, mantenendo tutte le impostazioni dei pool di origine nel nuovo pool. Ti piace questa ...Clona/Duplica/Copia un pool di applicazioni esistente in IIS 7

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

ora vorrei fare la stessa cosa in C# utilizzando le classi nello spazio dei nomi Microsoft.Web.Administration. Ho sfogliato lo spazio dei nomi e non riesco a trovare un modo per farlo facilmente. C'è il metodo MemberwiseClone che potrei chiamare per creare una copia superficiale del pool di app esistente, ma non so se questo duplicherebbe tutte le proprietà dei pool di app originali.

Qualcuno può aiutare?

+0

Hai mai trovato un modo per farlo? – DanM7

+0

@Dan Maguire, mi spiace, non esattamente. L'unica risposta che ho ricevuto finora non risolve completamente il problema. Non affronta come ottenere le proprietà dall'AppPool nella prima sezione al pool appena creato nella seconda sezione. Al momento sto pensando di chiamare il codice PowerShell direttamente nel mio programma C#. Ho un paio di settimane prima della scadenza per risolvere questo problema. Pubblicherò qualsiasi soluzione scegliamo una volta. –

risposta

3

ho trovato solo un modo finora di copiare un pool di applicazioni in 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); 
    } 

Perché la mia vera necessità è quella di avere una serie di impostazioni predefinite su tutti i nuovi pool di applicazioni, in realtà ho abbandonato la copia di un modello esistente pool e invece creare un pool di applicazioni con impostazioni predefinite usando Microsoft.Web.Administration. Anche se questa non è la domanda originale, la condivido comunque perché qualcuno che sta guardando questo post potrebbe essere interessato a questo:

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

io non sono sicuro di un metodo di copia, ma si poteva accedere alle proprietà del pool applicazione corrente e quindi creare un nuovo pool di app con le stesse proprietà:

// 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... 
    } 
} 

quindi si crea una nuova piscina nel vostro il codice chiamando il metodo di seguito elencati:

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

App metodo di creazione piscina dalle 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); 
    } 
} 
Problemi correlati