2009-12-17 4 views
23

Ho uno script PowerShell che configura le impostazioni del sito Web e dell'applicazione Web in IIS. Quindi utilizzo i cmdlet nello snap in WebAdministration. Ma questo script deve essere eseguito su Windows 2008, Windows 7 e Windows 2008 R2. E ho bisogno che funzioni con il minimo rumore da parte dell'utente.PowerShell: carica WebAdministration nello script ps1 su IIS 7 e IIS 7.5

Il problema è che Windows 7 e Windows 2008 R2 utilizzano IIS 7.5 fornito con WebAdministration installato come modulo. In Windows 2008 abbiamo installato il provider PowerShell di IIS 7, che installa WebAdministration come un gioco da ragazzi in.

Così tra cui import-module WebAdministration nello script fa saltare in aria su IIS 7, ma funziona bene su IIS 7.5 e comprendente add pssnapin WebAdministration fa esplodere su IIS 7.5, ma funziona bene su IIS 7.

Quindi la nostra soluzione è quello di rendere gli amministratori caricano WebAdministration manualmente con il comando appropriato per l'ambiente prima di eseguire lo script. Ma questo non è ottimale in quanto è facile dimenticare quale comando funziona in quale ambiente. Potremmo creare due diversi script, ma questo crea un problema di manutenzione per lo sviluppo.

Qualcuno ha risolto questo problema? Qualcuno sa come controllare l'ambiente e quindi chiamare il cmdlet appropriato dallo script PS?

--- RISPOSTA (per la mia situazione) ----

La soluzione è una combinazione di codice e console pre-configurato. IIS 7 PoSH Provider include un collegamento sul desktop che avvia una console PoSH con WebAdministration caricata. Quello combinato con la seguente funzione rende il mio script eseguito come un incantesimo su tutti e tre i sistemi.

Function Load-WebAdmin { 
    $webAdminModule = get-module -ListAvailable 
             | ? { $_.Name -eq "webadministration" } 
    If ($webAdminModule -ne $null) { 
    import-module WebAdministration 
    } 
} 

risposta

11

È possibile rilevare l'errore da uno o l'altro e fare l'opposto. Non dovete mio guscio a portata di mano, ma qualcosa di simile:

$succeeded = import-module WebAdministration 
if (($succeeded -ne $null) -and ($succeeded.GetType() -eq [System.Exception]) { 
    #Could not import, trying to snapin 
    add-pssnapin WebAdministration 
} 

In realtà pensare a questo un po 'più ...

$hasSnapin = get-pssnapin | Select { $_.Name.toLower().Trim() = "webadministration" } 
if ($hasSnapin -ne $null) { 
    add-pssnapin WebAdministration 
} else { 
    import-module WebAdministration 
} 

sulla prima, so che l'assegno tipo di errore sarà probabilmente necessario modificare . Per quanto riguarda il lavoro in corso, questo può effettivamente essere fatto in C# cercando nel registro gli snap-in caricati, o la versione di IIS installata sulla macchina e quindi utilizzare il metodo appropriato.

+1

L'unico problema è che mentre ** import-module ** può essere eseguito più volte senza generare un errore anche se il modulo è già caricato, ** add-pssnapin ** genera un errore se lo snap-in è già caricato. Grazie per l'ispirazione per una soluzione praticabile. –

+1

Questo potrebbe essere risolto con una seconda chiamata a ps-snapin per vedere se è già caricato nella sessione corrente – GrayWizardx

+0

1. Perché il secondo blocco usa 'Seleziona' invece di' Dove'? 2. '$ hasSnapin' sembra un nome scarsamente scelto. O dovrebbe esserci qualcosa che trasforma la lista in un booleano o il nome dovrebbe avere "ha" all'inizio. – jpmc26

0

Se si desidera creare sessioni di PowerShell "preconfigurate", guardare in file della console PowerShell ad es .:

man Export-Console -full 

È possibile creare uno per l'uso su Win7 e Server 2008 R2 e un altro per l'uso su Server08.

+0

Non pensavo che i file della console supportassero i moduli. Tuttavia è possibile utilizzare powershell con il parametro -file per creare un ambiente personalizzato che supporti il ​​caricamento dei moduli. –

+0

Oops. Sì hai ragione. Non supportano i moduli - troppo male. –

+0

Creare un collegamento per avviare powershell con il modulo di amministrazione Web/lo snap in già caricato potrebbe essere una soluzione se non riesco a capire come farlo in modo pulito nello script. –

32

Questo è probabilmente un po 'tardi per aiutarvi, ma ecco come facciamo questo:

$iisVersion = Get-ItemProperty "HKLM:\software\microsoft\InetStp"; 
if ($iisVersion.MajorVersion -eq 7) 
{ 
    if ($iisVersion.MinorVersion -ge 5) 
    { 
     Import-Module WebAdministration; 
    }   
    else 
    { 
     if (-not (Get-PSSnapIn | Where {$_.Name -eq "WebAdministration";})) { 
      Add-PSSnapIn WebAdministration; 
     } 
    } 
} 
+0

Questo è un ottimo modo per risolvere il problema –

+0

Oh, bellezza. Salvato la mia mattina. Grazie. – pdr

+0

ha funzionato come un fascino! eccezionale! – avidenic

2

Un altro modo utilizzando la versione di Windows:

if ([System.Version](Get-ItemProperty -path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").CurrentVersion -ge [System.Version] "6.1") 
{ Import-Module WebAdministration } 
else 
{ Add-PSSnapin WebAdministration } 
+0

Che dire della versione 6.1? qualsiasi tavolo completo con tutte le versioni? – Kiquenet

3

Questo è grande. Tutto quello che dovevo fare era aggiungere un altro in modo da aggiungere lo snap-in quando si esegue su Windows 2008. Questo funziona negli script per la mia situazione.

Function Load-WebAdmin { 
    $webAdminModule = get-module -ListAvailable | ? { $_.Name -eq "webadministration" } 
    If ($webAdminModule -ne $null) { 
    import-module WebAdministration 
    }else{ 
    Add-pssnapin WebAdministration 
    } 
} 
+1

Il problema con questo approccio è che non controllo il modo in cui viene lanciato PowerShell. Se l'utente avvia PowerShell dall'icona installata dal provider PowerShell di IIS, lo snap-in WebAdministration viene già caricato in PowerShell e la chiamata WebAdministration Add-pssnapin genera un errore. @GlennS ha la soluzione più elegante. –

2

mi sono imbattuto in questo problema oggi e qui è la soluzione che ho usato

Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue

Import-Module WebAdministration -ErrorAction SilentlyContinue

Il l'unica situazione in cui non funziona è stata se lo snap-in di iis powershell non è stato installato affatto.

+0

C'è un modo per automatizzare anche la sua installazione? –