Проблема с тихой установкой программ, которым требуется конфигурационный файл

Для автоматической установки программ в домене MS существуют разные продукты как от самих MS так и от других компаний. Например Kaspersky Security Center, помимо того, что контролирует работу антивирусных программ на хостах,  умеет разворачивать стороннее ПО. У него понятный и удобный интерфейс. Всё что нужно сделать админу — это загрузить пакет, глянуть какие ключи используются для тихой установки, прописать их и всё.

С помощью таких продуктов мы можем накатывать «простые» программы: браузеры, видеоплееры, архиваторы, к примеру smplayer-16.4.0-win32.exe /S . KSC поддерживает несколько ключей и можем, например, указать в какой каталог устанавливать программу.

Об корпоративной установке своего офиса MS позаботилось, с помощью Microsoft Office Customization Tool можно задать и тихую установку и нужные компоненты офиса и обновления туда сразу впихнуть и вообще много чего. На выходе получится подготовленный дистрибутив, который установит сам себя по-тихому, после запуска setup.exe.

Но как быть с ПО которое ставится автоматически только если есть конфигурационный файл, где должны быть прописаны параметры для установки? Например Visual Studio, MatLab итд. Не знаю как сейчас, но на момент решения этой проблемы (конец 2014 года) KSC не поддерживал конфигурационный файл.

Я уверен, что SCCM умеет это делать. Но если у вас задача поставить VS в терминальном классе из 20ти машин, а потом еще раз в месяц ставить сотрудникам в индивидуальном порядке, то проще будет использовать скрипт.

Установка Visual Studio 2015

$computername = Get-Content \smb.sample.ru\service\list-computers\sample-list.txt #Указание списка компьютеров, находящегося в файле
#$computername = "sample-pc" #Указание конкретного компьютера
$sourcefile = "\smb.sample.ru\service\VS" #Каталог дистрибутива на файловом сервере
$cred = get-credential #Всплывающее окно авторизации

#Перебор всех компьютеров из $computername
foreach ($computer in $computername)
{

    $destinationFolder = "\$computer\C$\Windows\Temp\" #Каталог Temp на клиенте
    #Если папка на рабочей станции не создана - создаём
	if (!(Test-Path -path $destinationFolder))
	{
		New-Item $destinationFolder -Type Directory
	}

   #Копируем дистрибутив с сервера на рабочую станцию
   Copy-Item -Path $sourcefile -Destination $destinationFolder -Recurse

   #Выполнение команды установки на удаленном клиенте. Аргументы нужно брать в одинарные кавычки и разделять запятыми
   Invoke-Command -ComputerName $computer -ScriptBlock {
    $setup = "C:\Windows\Temp\VS\vs_premium.exe"
    $argument = '/Q', '/S', '/NoWeb', '/NoRefresh', '/Log C:\Windows\Temp\VS\vs-log\logs\log.txt', '/AdminFile C:\Windows\Temp\VS\AdminDeployment.xml', '/ProductKey xxxxx-xxxxx-xxxxx-xxxxx-xxxxx'
    $destinationFolderRemove = "C:\Windows\Temp\VS\"
    Start-Process -Wait -FilePath $setup -ArgumentList $argument
    Remove-Item $destinationFolderRemove -Recurse #Удаление папки дистрибутива из Temp на клиенте
   }  -credential $cred

}

Код прокомментирован, если даже не знаете PS, то разберетесь с гуглом за короткое время. А я поясню некоторое, чтоб не осталось вопросов.

Бывает ситуации когда требуется установить ПО на один компьютер, бывает на много. Поэтому я сделал два варианта указания компьютеров:

  1. Списком — это первая строка. Берем NetBIOS имена из файла, в котором они идут списком. Каждое имя на новой строке

  2. Единственный компьютер — это вторая строка. Просто указываем одно имя

Ну и соответственно, одна из строк должна быть закомментирована.

Есть большой минус у этого кода — он выполняется последовательно. т.е. сначала идет копирование, установка, удаление на первый компьютер и только потом на второй в списке.

В аргументах $argument перечисляем что установка у нас тихая, что в интернет лезть не нужно, а так же заставим писать лог установки и укажем установочный файл конфигурации. И да, конечно, ключ лицензии, куда без него.

Вообще мне кажется, раз есть установочный конфиг, то в нём все аргументы и должны указываться. Но ребятам из MS виднее.

В официальной документации все аргументы хорошо описаны.

Установка Matlab 7.5

$computername = Get-Content \smb.sample.ru\service\list-computers\sample-list.txt #Указание списка компьютеров, находящегося в файле
#$computername = "sample-pc" #Указание конкретного компьютера
$sourcefile = "\smb.sample.ru\service\VS" #Каталог дистрибутива на файловом сервере
$cred = get-credential #Всплывающее окно авторизации

#Перебор всех компьютеров из $computername
foreach ($computer in $computername)
{

    $destinationFolder = "\$computer\C$\Windows\Temp\" #Каталог Temp на клиенте
    #Если папка на рабочей станции не создана - создаём
	if (!(Test-Path -path $destinationFolder))
	{
		New-Item $destinationFolder -Type Directory
	}

#Копируем дистрибутив с сервера на рабочую станцию
Copy-Item -Path $sourcefile -Destination $destinationFolder -Recurse

#Выполнение команды установки на удаленном клиенте. Аргументы нужно брать в одинарные кавычки и разделять запятыми
Invoke-Command -ComputerName $computer -ScriptBlock {
    $setup = "C:\Windows\Temp\matlab7.5-x32\setup.exe"
    $argument = '-if C:\Windows\Temp\matlab7.5-x32\matlab7.5-installer.ini'
    $destinationFolderRemove = "C:\Windows\Temp\matlab7.5-x32\"
    Start-Process -Wait -FilePath $setup -ArgumentList $argument
    Start-Sleep 60 #Задержка на минуту
    Remove-Item $destinationFolderRemove -Recurse #Удаление папки дистрибутива из Temp на клиенте
}  -credential $cred

}

Принцип тот же, изменяем лишь названия и аргументы. В Matlab 7.5 все пожелания к установке задаются в установочном конфиге. Еще установочнику Matlab нужно дать подумать минутку, перед удалением дистрибутива с хоста.

В примере x32, x64 тоже хорошо ставится.

Ещё чуть чуть

Я написал только о скрипте установки. Вам потребуется так же разобраться с:

  • Созданием конфигов для нужного дистрибутива
  • Созданиием smb сервера (вдруг нет), к которому должен быть доступ у пользователя под которым производится инсталяция
  • Копированием туда дистрибутивов, конфигов и списков компьютеров
  • Разрешением для пользователя копировать файлы на хосты и запускать инсталяции. Настраивается в GPO

Мой телеграм-канал .