PowerShell: загрузка WebAdministration в сценарии PS1 на IIS 7 и IIS 7.5 - PullRequest
23 голосов
/ 17 декабря 2009

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

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

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

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

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

--- ОТВЕТ (за мою ситуацию) ----

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

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

Ответы [ 6 ]

32 голосов
/ 01 декабря 2010

Возможно, вам уже поздно помогать, но вот как мы это делаем:

$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;
        }
    }
}
11 голосов
/ 17 декабря 2009

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

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

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

3 голосов
/ 15 марта 2011

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

Function Load-WebAdmin {
  $webAdminModule = get-module -ListAvailable | ? { $_.Name -eq "webadministration" }
  If ($webAdminModule -ne $null) {
    import-module WebAdministration
  }else{
    Add-pssnapin WebAdministration
   }
}
2 голосов
/ 02 ноября 2012

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

Add-PSSnapin WebAdministration - Ошибка действия Продолжение

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

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

2 голосов
/ 06 декабря 2010

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

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

man Export-Console -full

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...