2009-12-17 17 views
23

Tengo una secuencia de comandos de PowerShell que configura el sitio web y la configuración de la aplicación web en IIS. Así que uso los cmdlets en la administración web complemento. Pero esta secuencia de comandos debe ejecutarse en Windows 2008, Windows 7 y Windows 2008 R2. Y necesito que funcione con un mínimo esfuerzo por parte del usuario.PowerShell: cargue la administración web en la secuencia de comandos ps1 en IIS 7 e IIS 7.5

El problema es que Windows 7 y Windows 2008 R2 usan IIS 7.5 que viene con la administración web instalada como módulo. En Windows 2008 hemos instalado el proveedor de PowerShell de IIS 7, que se instala WebAdministration como un complemento en.

Así incluyendo import-module WebAdministration en el guión hace saltar en IIS 7, pero funciona bien en IIS 7.5 e incluyendo Agregar- pssnapin WebAdministration explota en IIS 7.5 pero funciona bien en IIS 7.

Por lo tanto, nuestra solución consiste en hacer que los administradores carguen WebAdministration manualmente con el comando apropiado para el entorno antes de ejecutar el script. Pero esto no es óptimo, ya que es fácil olvidar qué comando funciona en qué entorno. Podríamos crear dos scripts diferentes, pero eso crea un problema de mantenimiento para el desarrollo.

¿Alguien ha resuelto este problema? ¿Alguien sabe cómo verificar el entorno y luego llamar al cmdlet apropiado desde el script PS?

--- RESPUESTA (por mi situación) ----

La solución es una combinación de código y la consola preconfigurado. El proveedor IIS 7 PoSH incluye un acceso directo de escritorio que inicia una consola PoSH con la administración web cargada. Eso combinado con la siguiente función hace que mi script se ejecute como un hechizo en los tres sistemas.

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

Respuesta

11

Es posible detectar el error de uno u otro y hacer lo contrario. No tiene mi concha conveniente, pero algo como:

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

hecho de pensar en esto un poco más ...

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

En el primero de ellos, sé que el cheque tipo de error, probablemente tendrá que ser modificado . En lo que respecta al trabajo en curso, esto se puede hacer realmente en C# buscando en el registro los snapins cargados, o la versión de IIS instalada en la máquina y luego use el método apropiado.

+1

El único problema con esto es que aunque ** import-module ** se puede ejecutar varias veces sin generar un error aunque el módulo ya esté cargado, ** add-pssnapin ** generará un error si el snapin es ya cargado Gracias por la inspiración de una solución viable. –

+1

Eso podría solucionarse con una segunda llamada a ps-snapin para ver si ya está cargada en la sesión actual – GrayWizardx

+0

1. ¿Por qué su segundo bloque usa 'Seleccionar' en lugar de' Donde'? 2. '$ hasSnapin' parece un nombre mal elegido. O bien debería haber algo que convierte la lista de nuevo en un booleano o el nombre debería tener 'has' en su comienzo. – jpmc26

0

Si desea crear sesiones de PowerShell "preconfigurados", buscar en los archivos de consola de PowerShell ej .:

man Export-Console -full 

Se puede crear una para uso en Win7 y Server 2008 R2 y otro para su uso en Server08.

+0

No creo que los archivos de consola sean compatibles con los módulos. Sin embargo, puede usar powershell con el parámetro -file para crear un entorno personalizado que admita la carga de módulos. –

+0

Vaya. Sí tienes razón. No admiten módulos, es una lástima. –

+0

Crear un acceso directo para iniciar powershell con el módulo de administración web/snap in ya cargado podría ser una solución si no puedo encontrar la manera de hacerlo limpiamente en el script. –

32

Esto es probablemente un poco tarde para ayudarte, pero aquí es cómo lo hacemos:

$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

Esa es una gran manera de resolver el problema –

+0

Oh, eres hermosa. Guardado mi mañana. Gracias. – pdr

+0

funcionó como un encanto! ¡increíble! – avidenic

2

Otra forma de usar la versión de 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

¿Qué hay de la versión 6.1? cualquier mesa completa con todas las versiones? – Kiquenet

3

Esto es grande. Todo lo que tuve que hacer fue agregar otro para que agregue el complemento cuando se ejecute en Windows 2008. Esto funciona en las secuencias de comandos para mi situación.

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

El problema con este enfoque es que no controlo cómo se lanza powershell. Si el usuario inicia powershell desde el ícono instalado por el proveedor de IIS powershell, la inserción de administración web ya está cargada en powershell y la llamada Add-pssnapin WebAdministration arrojará un error. @GlennS tiene la solución más elegante. –

2

me encontré con este problema hoy y aquí es solución Solía ​​

Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue

Import-Module WebAdministration -ErrorAction SilentlyContinue

El La única situación en la que esto no funciona es si el snap de iis powershell no está instalado en absoluto.

+0

¿Existe alguna manera de automatizar su instalación también? –

Cuestiones relacionadas