Подтвердить что ты не робот

PowerShell: загрузить WebAdministration в ps1 script на IIS 7 и IIS 7.5

У меня есть PowerShell script, который настраивает параметры веб-сайта и веб-приложения в IIS. Поэтому я использую командлеты в оснастке WebAdministration. Но этот script должен запускаться в Windows 2008, Windows 7 и Windows 2008 R2. И мне нужно, чтобы он работал с минимальным шумом от пользователя.

Проблема в том, что Windows 7 и Windows 2008 R2 используют IIS 7.5, который поставляется с установленной администрацией WebAdministration в качестве модуля. В Windows 2008 мы установили поставщика IIS 7 PowerShell, который устанавливает WebAdministration как оснастку.

Таким образом, включение импорта-модуля WebAdministration в script взорвется на IIS 7, но отлично работает на IIS 7.5 и включает в себя add-pssnapin WebAdministration, что приводит к взрыву в IIS 7.5 но отлично работает на IIS 7.

Таким образом, наше обходное решение заключается в том, чтобы администраторы загрузили WebAdministration вручную с помощью соответствующей команды для среды перед запуском script. Но это не оптимально, так как легко забыть, какая команда работает в какой среде. Мы могли бы создать два разных сценария, но это создает проблему обслуживания для разработки.

Кто-нибудь решил эту проблему? Кто-нибудь знает, как проверить среду, а затем вызвать соответствующий командлет из PS script?

--- ОТВЕТ (для моей ситуации) ----

Решение представляет собой комбинацию кода и предварительно сконфигурированной консоли. Поставщик PoSH IIS 7 включает ярлык на рабочем столе, который запускает консоль PoSH с загрузкой WebAdministration. Это в сочетании со следующей функцией делает мой script запущенным как шарм для всех трех систем.

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

Ответ 1

Можно ли поймать ошибку от того или другого, и сделать наоборот. У меня нет оболочки, но что-то вроде:

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

На самом деле думать об этом немного больше...

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

Во-первых, я знаю, что проверка типа ошибки, вероятно, потребуется изменить. Что касается работы, на самом деле это можно сделать на С#, просмотрев в реестре загруженные snapins или версию IIS, установленную на компьютере, а затем используйте соответствующий метод.

Ответ 2

Это, вероятно, немного поздно, чтобы помочь вам, но вот как мы это делаем:

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

Ответ 3

Это здорово. Все, что мне нужно было сделать, это добавить еще один, чтобы добавить оснастку при запуске в Windows 2008. Это работает в сценариях для моей ситуации.

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

Ответ 4

Другой способ использования версии 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 }

Ответ 5

Сегодня я столкнулся с этой проблемой, и вот решение, которое я использовал

Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue

Импорт-модуль WebAdministration -ErrorAction SilentlyContinue

Единственная ситуация, в которой это не работает, заключается в том, что snipin для iis powershell вообще не установлен.

Ответ 6

Если вы хотите создать "предварительно настроенные" сеансы PowerShell, просмотрите файлы консоли PowerShell, например:

man Export-Console -full

Вы можете создать его для использования на Win7 и Server 2008 R2, а другой для использования на Server08.