PowerShell: Ładowanie WebAdministration w skrypcie ps1 zarówno na IIS 7, jak i IIS 7.5

Mam skrypt PowerShell, który konfiguruje ustawienia strony internetowej i aplikacji internetowej w IIS. Więc używam cmdletów w WebAdministration snap in. Ale ten skrypt musi działać w systemach Windows 2008, Windows 7 i Windows 2008 R2. I muszę go uruchomić z minimalnym zamieszaniem ze strony użytkownika.

Problem polega na tym, że Windows 7 i Windows 2008 R2 używają IIS 7.5, który jest dostarczany z WebAdministration zainstalowanym jako moduł. W systemie Windows 2008 zainstalowaliśmy IIS 7 PowerShell provider, który instaluje WebAdministration w mgnieniu oka.

Więc włączenie import-module WebAdministration w skrypcie wybucha na IIS 7, ale działa dobrze na IIS 7.5 i włączenie add-pssnapin WebAdministration wybucha na IIS 7.5, ale działa dobrze na IIS 7.

Więc naszym obejściem jest zmuszenie administratorów do ręcznego załadowania WebAdministration za pomocą odpowiedniej komendy dla środowiska przed uruchomieniem skryptu. Ale nie jest to optymalne, ponieważ łatwo jest zapomnieć, które polecenie działa w jakim środowisku. Możemy stworzyć dwa różne skrypty, ale to stwarza problem z utrzymaniem dla rozwoju.

Czy ktoś rozwiązał ten problem? Czy ktoś wie jak sprawdzić środowisko i wywołać odpowiedni cmdlet z poziomu skryptu PS?

--- ODPOWIEDŹ (dla mojej sytuacji) - - - -

Rozwiązanie jest kombinacją kodu i wstępnie skonfigurowanej konsoli. IIS 7 PoSH Provider zawiera skrót pulpitu, który uruchamia elegancką konsolę z Webadministration załadowany. To w połączeniu z poniższą funkcją sprawia, że mój skrypt działa jak urok na wszystkich trzech systemach.

Function Load-WebAdmin {
  $webAdminModule = get-module -ListAvailable 
                                        | ? { $_.Name -eq "webadministration" }
  If ($webAdminModule -ne $null) {
    import-module WebAdministration
  }
}
Author: SteveC, 2009-12-17

6 answers

Czy można wyłapać błąd z jednego lub drugiego i zrobić odwrotnie. Nie mam pod ręką mojej powłoki, ale coś w stylu:

$succeeded = import-module WebAdministration
if (($succeeded -ne $null) -and ($succeeded.GetType() -eq [System.Exception]) {
  #Could not import, trying to snapin
  add-pssnapin WebAdministration
}
Właściwie myślę o tym trochę bardziej...
$hasSnapin = get-pssnapin | Select { $_.Name.toLower().Trim() = "webadministration" }
if ($hasSnapin -ne $null) {
  add-pssnapin WebAdministration
} else {
  import-module WebAdministration
}

Na pierwszym z nich Wiem, że sprawdzenie typu błędu prawdopodobnie będzie wymagało modyfikacji. Jeśli chodzi o pracę, można to zrobić w C#, patrząc w rejestrze załadowanych snapins, lub wersji IIS zainstalowanej na komputerze, a następnie użyć odpowiedniej metody.

 11
Author: GrayWizardx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 20:20:27

To prawdopodobnie trochę za późno, aby ci pomóc, ale oto jak to zrobimy:

$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;
        }
    }
}
 32
Author: GlennS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 15:32:28

To jest świetne. Wszystko, co musiałem zrobić, to dodać else, aby dodać przystawkę podczas uruchamiania w systemie Windows 2008. To działa w scenariuszach dla mojej sytuacji.

Function Load-WebAdmin {
  $webAdminModule = get-module -ListAvailable | ? { $_.Name -eq "webadministration" }
  If ($webAdminModule -ne $null) {
    import-module WebAdministration
  }else{
    Add-pssnapin WebAdministration
   }
}
 3
Author: rayrayrayraydog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-27 06:31:05

Inny sposób korzystania z wersji 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 }
 2
Author: Matt D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 14:02:39

Natknąłem się dziś na ten problem i oto rozwiązanie, którego użyłem

Add-PSSnapin WebAdministration-ErrorAction SilentlyContinue

Import-Module WebAdministration-ErrorAction SilentlyContinue

Jedyną sytuacją, w której to nie działa, było to, że program iis powershell snapin nie jest w ogóle zainstalowany.

 2
Author: Keith Lawrence,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 16:26:09

Jeśli chcesz utworzyć "wstępnie skonfigurowane" sesje PowerShell, zajrzyj do plików konsoli PowerShell, np.:

man Export-Console -full

Możesz utworzyć jeden do użytku na Win7 i Server 2008 R2 i drugi do użytku na Server08.

 0
Author: Keith Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-18 00:43:07