Долгая загрузка Import-Module в PowerShell
Добрый день! В своей практике я очень часто стараюсь использовать для автоматизации PowerShell и PowerCli, которые имеют огромнейшую библиотеку различных моделей, практически под любую задачу администратора. В последнее время я стал замечать, что при первом импорте нужного модуля, через команду Import-Module, идет очень долгое выполнение, которое может длиться до 2-5 минут, что странно и неудобно. Чуть ниже я вам покажу, в чем могут быть причины и как это все исправить.
Причины долгого выполнения
Когда я открываю PowerShell ISE и хочу загрузить модули PowerCli, мне приходится ждать почти две минуты. Вроде это не критично, но не удобно, когда требуется сделать. что-то быстро.
measure-command{Import-Module VMware.PowerCLI}
Посмотреть текущий список ваших модулей, на примере VMware.PowerCLI можно командой:
Get-Module vmware.powercli -ListAvailable | Select Name,Version
Как видите у меня их три, по умолчанию загружается самая последняя
А вот если я загружаю самую старую, то она залетает за пару секунд.
Самое интересное, что на фоне других модулей VMware, VMware.PowerCLI очень долго грузится:
# Получаем все модули, содержащие "VMware" в имени
$vmwareModules = Get-Module -ListAvailable | Where-Object { $_.Name -like "*VMware*" }# Создаем массив для хранения результатов
$importResults = @()# Переменные для подсчета общего времени и количества модулей
$totalImportTime = [TimeSpan]::Zero
$successfulImports = 0# Импортируем каждый модуль и замеряем время импорта
foreach ($module in $vmwareModules) {
$moduleName = $module.Name# Замеряем время импорта с помощью Measure-Command
$executionTime = Measure-Command {
try {
Import-Module $moduleName -ErrorAction Stop
$importSuccessful = $true
} catch {
Write-Host "Ошибка при импорте модуля $moduleName $_"
$importSuccessful = $false
}
}# Сохраняем результат в массив
if ($importSuccessful) {
$importResults += [PSCustomObject]@{
ModuleName = $moduleName
ImportTime = [math]::Round($executionTime.TotalSeconds, 3) # Округляем до 3 знаков после запятой
}
# Увеличиваем счетчик успешных импортов и общее время
$successfulImports++
$totalImportTime += $executionTime
} else {
$importResults += [PSCustomObject]@{
ModuleName = $moduleName
ImportTime = "Ошибка"
}
}
}# Выводим результаты в таблице
$importResults | Format-Table -AutoSize# Выводим общее количество успешно импортированных модулей и общее время выполнения
Write-Host "`nОбщее количество успешно импортированных модулей: $successfulImports"
Write-Host "Общее время выполнения: $([math]::Round($totalImportTime.TotalSeconds, 3)) секунд"
Данная проблема еще тянется с 2010-х годов и у нее несколько причин:
- Идет фоновая проверка списка отозванных сертификатов (CRL)
- Слишком большое количество модулей в нужном пакете
- Устаревшие модули
Обновление модулей
Я всегда советую, перед внедрением других настроек произвести обновление модулей до самых актуальных версий. Сделать это можно командой:
update-module -Force
Так же советую удалить старые версии если вы их не используете, для этого есть команда:
Uninstall-Module -Name VMware.PowerCLI -RequiredVersion "10.1.1.8827524"
Отключение проверки аннулированных сертификатов
В операционной системе есть полезный функционал, который проверяет список отозванных сертификатов, это помогает в безопасности. Но если у вас нет интернета в системе, данный функционал может вызывать задержки в загрузке различных модулей PowerShell. Попробуйте отключить две функции и проверить ускорит ли это работу VMware.PowerCLI м момент загрузки.
Откройте окно "Выполнить" и введите в нем команду:
control /name Microsoft.InternetOptions
Оно откроет у вас свойства обозревателя, тут вы сможете внести настройки для интернета подключения.
Перейдите на вкладку "Дополнительно". Вам необходимо снять две галочки:
- Проверять аннулирование сертификатов издателей (Check for publisher’s certificate revocation) - в Windows отвечает за проверку действительности сертификатов, используемых для подписи программного обеспечения. Когда вы запускаете или устанавливаете приложение, Windows проверяет, не был ли отозван сертификат, который подписывает это приложение.
- Проверять, не отозван ли сертификат сервера - Когда эта опция включена, операционная система или приложение проверяет, был ли сертификат, используемый для подписи программного обеспечения, отозван.
Перезагрузка вашего компьютера или сервера не потребуется. данные настройки применяются налету.
То же самое можно сделать через ключи реестра, в командной строке вы можете их создать:
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Internet Explorer\Download" /v CheckExeSignatures /d no /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings" /v CertificateRevocation /t REG_DWORD /d 0 /f
Для удаления ключей можно воспользоваться такими командами:
REG DELETE "HKLM\SOFTWARE\Policies\Microsoft\Internet Explorer\Download" /v CheckExeSignatures /f
REG DELETE "HKLM\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings" /v CertificateRevocation /f