Можно ли отключить msiexec help GUI?

Я автоматизирую автоматический поиск и установку указанных пакетов.msi с помощью скрипта powershell, но если команда вызывается с ошибками синтаксиса, msiexec будет бесконечно долго ждать нажатия кнопки OK на своем отображении справки, несмотря на наличие /quiet и / или /passive,

На данный момент я вызываю это с:

(start-process -FilePath "msiexec" -ArgumentList "/i <path_to_package> /quiet /passive" -PassThru -Wait).ExitCode

Есть ли способ отключить отображение справки msiexec?

4 ответа

Решение

К сожалению, я думаю, что единственный способ избежать отображения справки - это...

... не допускайте опечаток / синтаксических ошибок.

Хотел бы я иметь лучший ответ для вас, но...

Нет способа отключить это поведение для msiexec Команда, содержащая синтаксическую ошибку. Вы можете заключить команду в нечто вроде следующего. Он использует.NET Automation для поиска окна "использования" и работы с ним в скрипте.

Add-Type -AssemblyName UIAutomationClient
Add-Type -AssemblyName UIAutomationTypes

# Note the invalid argument '/badswitch'
$mse = Start-Process -FilePath 'msiexec' -ArgumentList "/i package.msi /badswitch /quiet /passive" -PassThru

# Let msiexec at least get off the ground
[void] $mse.WaitForInputIdle()

# Create an AutomationElement from $mse's handle
$mseAuto = [Windows.Automation.AutomationElement]::FromHandle($mse.MainWindowHandle)

# A PropertyCondition for findAll()
$pane = New-Object Windows.Automation.PropertyCondition -ArgumentList (
    [Windows.Automation.AutomationElement]::ControlTypeProperty,
    [Windows.Automation.ControlType]::Pane
)

# Search for a child $pane element.
$findResult = $mseAuto.FindFirst(
    [System.Windows.Automation.TreeScope]::Children,
    $pane
)

# If there's a pane element in $mseAuto, and it contains "usage" string, it's an msiexec syntax issue, so close $mse's window.
if ( $findResult.Current.Name -match 'msiexec /Option <Required Parameter>' ) {
    [void] $mse.CloseMainWindow()
} else {
    # You should put something more sane here to handle waiting for "good" installs to complete.
    $mse.WaitForExit()    
}

$mse.ExitCode

Это тоже имеет проблемы. С /quiet диалоговое окно прогресса все еще отображается во время установки. Вы можете рассмотреть возможность использования /qn вместо того, чтобы скрыть все msiexec Элементы пользовательского интерфейса. Также MSI может вызвать другие ошибки, необработанные, что приостановит неверность выполнения. Возможно, включить значение времени ожидания? А что за внешний процесс запущен из таблицы CustomAction? Извините, я близок к бессвязному делу...

Я бы просто не стал использовать msiexec.exe. Это возможно, используя API установщика Windows, используя сценарии или код.

Вы можете использовать автоматизацию COM с помощью VBScript / VBA / VB или с помощью DTF, который является оболочкой.NET для API установщика Windows, с которой легче работать из языков.NET, таких как C#.

Вы даже можете напрямую перейти через C++ к необработанным вызовам Win32 API, но это просто пустая трата времени, поскольку у вас есть как COM, так и.NET-эквиваленты, которые вызывают необработанный Win32 API как часть их работы.


Решение 1: VBScripts и COM Automation

Если использование автоматизации является опцией, вы должны иметь возможность пройти автоматизацию COM установщика Windows и автоматизировать установку / удаление таким образом. Вот VBScript, который вы можете поместить в файл и запустить (очевидно, обновите имя пути MSI):

Const msiUILevelEndDialog = 128

Set msi = CreateObject("WindowsInstaller.Installer")
msi.UILevel = msiUILevelEndDialog
msi.InstallProduct( "C:\msifile.msi")
Set msi = Nothing

Решение 2: DTF - Фонд средств развертывания -.NET

DTF (Deployment Tools Foundation) - это, по сути, оболочка.NET для API установщика Windows - он содержит такую ​​мощную коллекцию сборок.NET для работы непосредственно с аспектами установщика Windows, поэтому я просто хочу добавить его сюда для справки для тех, кто искать решение с большим количеством детального контроля развертывания, чтобы решить их проблему администрирования. Очень простой код в приложении C# обеспечивает полный контроль над процессом установки. Вот грубый макет:

using Microsoft.Deployment.WindowsInstaller.Installer;

Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.InstallProduct(msiFilename, "ACTION=INSTALL ALLUSERS=1");

Вы можете овладеть DTF с помощью инструментария WIX, который представляет собой общее решение для создания файлов MSI из исходных файлов XML. Вы найдете отличную документацию в DTF.chm и DTFAPI.chm, а фактические файлы находятся в основной папке установки. Последние два, как правило, вам нужны:

  • Microsoft.Deployment.Compression.dll - платформа для упаковки и распаковки архивов.
  • Microsoft.Deployment.Compression.Cab.dll - Осуществляет упаковку и распаковку архивов кабинета.
  • Microsoft.Deployment.Resources.dll - классы для чтения и записи данных ресурсов в исполняемые файлы.
  • Microsoft.Deployment.Windows Installer.dll - полная библиотека классов для API установщика Windows.
  • Microsoft.Deployment.Windows Installer.Package.dll - Расширенные классы для работы с установщиком Windows и пакетами исправлений.

Просто создайте проект C#, ссылайтесь на эти файлы и кодируйте свое собственное приложение развертывания с любым управлением, которое вы пожелаете и в чем нуждаетесь. В настоящее время я не настроен на использование инструментов для DTF, но посмотрите на этот пример, чтобы получить общее представление о том, как будет работать программа на C#.


Решение 3: Функции установщика C++

Я просто подумал, что добавлю это - это в значительной степени не имеет значения для системных администраторов, я верю, но это может помочь лучше понять технологию MSI. Помимо автоматизации COM, есть также Win32 API с функциями, доступными из C++. Конечно, гораздо лучшая производительность (автоматизация COM, очевидно, вызывает эти функции Win32 под капотом - COM, конечно, является просто оберткой поверх этих "реальных" функций).

У меня сейчас нет доступных примеров C++ для этого, но вот документация SDK: Справочник установщика Windows. И прямая ссылка на список актуальных функций установщика. Этот список функций должен дать вам краткое представление о том, каково это использовать эту технологию.

ОБНОВЛЕНИЕ: я добавил пример фрагмента кода C++ в этот ответ на стекоперенос о различных способах удаления пакета MSI (раздел 14 в нижней части ответа).

Системные администраторы не будут использовать эту опцию, но коммерческие инструменты будут использовать для доступа к системной базе данных MSI (хранящейся в нескольких местах в реестре и с папкой кэша на диске - %SystemRoot%\Installer - и несколько "рабочих папок"). Например, ваша SCCM или аналогичная система развертывания будут использовать их "под капотом".

Вы пробовали /qn ключ? он должен подавлять все запросы интерфейса пользователя.

http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx

Другие вопросы по тегам