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
}
}
Ответы
Ответ 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.