Reinstall Citrix и ThinPrint с помощью скрипта

unnamed

Есть у нас на работе такие товарищи, которые любят применять метод шоковой терапии ко всему подряд. Это, конечно, с одной стороны хорошо, когда организация, в целом, населена злобными троллями, которые отвергают прогресс и обновления. С другой стороны, всякая шоковая терапия грозит головной болью для пользователей и саппорта.

Недавно системные администраторы объявили, что в скором времени старые версии Citrix работать у нас не будут.  Пользователи, которые до сих пор работали с Citrix Online Plugin, оказались под угрозой. В принципе, их не очень много, около трёхсот, но, представив себе перспективу переустановки клиента Citrix вручную, я ужаснулся и решил это дело автоматизировать.

Надо отметить, что полная переустановка citrix включает в себя не только удаление самой программы, но также удаление связанных папок в профиле пользователя и переустановку программы ThinPrint Client Windows, которая нужна для печати из опубликованных через цитру приложений.

В общем, я написал немудрёный скрипт в PowerShell-е, который затем вырос до полутора сотен строк при участии тех же системных администраторов. Это был первый опыт скриптописания для меня, так что я уверен, что всё можно было сделать гораздо компактнее и проще, обладая соответствующим опытом. Тело скрипта с комментариями дальше.

Для начала прописываем правило рассылки сообщения о старте работы скрипта на мой рабочий адрес:

function sendMail{param($BBody,$Subbj)

Write-Host «Sending Email»
$smtpServer = «email.bank.int»
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = «CitrixUpdate@domen.ru»
$msg.To.Add(«name@domen.ru,name2@domen.ru»)
$msg.subject = $Subbj
$msg.body = «$BBody»
#Sending email
$smtp.Send($msg)
}

Для того, чтобы скрипт запустился, сначала проверяем текущую установленную версию цитрикса на клиенте, а также разрядность ОС. Если версия цитрикс ниже Receiver, то скрипт выполняется. Если ресивер уже установлен, то скрипт просто закрывается:

##First of All Check Citrix Version
write-host
write-host «***************************»
$d=get-date
write-host $d

If ((Get-WmiObject Win32_OperatingSystem).OSArchitecture -match «64*») {$regpath=»HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*»}
else {$regpath=»HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*»}
$res=Get-ItemProperty $regpath | where-object {$_.DisplayName -like ‘Сетевой подключаемый модуль Citrix*’}| Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize
if ($res -ne $null)
{

write-host «Нашли компоненты старого Citrix: »
$res
#If (test-path «C:\ProgramData\Citrix\Подключаемый модуль Citrix для сетевых приложений»)
#{
write-host «Нашли старый клиент»
##User Notification

$start=»C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\CitrixWait2.lnk»
$Existlnk = test-path $start
$Citrix=»C:\tempOk»
$ExistTempok = test-path $Citrix

write-host «Existlnk: » $Existlnk
write-host «ExistTempok: » $ExistTempok

Для уведомления пользователя о работе скрипта на его компьютере, мы сделали специальное уведомление, которое нельзя закрыть или свернуть. Здесь выполняется проверка наличия данного уведомления в автозагрузке. Если уведомления нет, то скрипт копирует его в автозагрузку с сервера, после следующей перезагрузки скрипт начнёт выполняться. Если уведомление уже есть, оно блокирует работу пользователя, скрипт выполняется:

##Check File CitrixWait. Run Script if File Exist
If (($Existlnk) -and ($ExistTempok))
{
sendMail «Запустили вторую часть скрипта на компьютере $env:computername » «Citrix Update 2nd on $env:computername»
##Kill Citrix Client Processses

write-host «kill process: wfcrun32»
Stop-Process -ProcessName wfcrun32 -force
write-host «kill process: ssonsvr»
Stop-Process -ProcessName ssonsvr -force
write-host «kill process: pnamain»
Stop-Process -ProcessName pnamain -force

Эта часть скрипта удаляет старую версию цитрикса. Начиная, кажется, с версии online Plugin 11, удаление можно производить с помощью файла TrolleyExpress.exe с соответствующими ключами. Версии ниже можно удалять с помощью перечисления GUID (я не стал перечислять их в своём скрипте, так как у нас нет настолько старых версий):

##Uninstall old version Citrix
$InstallDirs = «`»$InstallLocationC:\ProgramData\Citrix\Подключаемый модуль Citrix для сетевых приложений\TrolleyExpress.exe`»»

foreach ($InstallDir in $InstallDirs)

{
Start-Process -FilePath $InstallDir -ArgumentList «/uninstall /cleanup /silent» -wait
write-host «Start process uninstall for $InstallDir»
}

В этой части удаляются все связанные с цитриксом папки в профилях пользователей:

##Delete Citrix Folders
Get-ChildItem «c:\users» | ForEach-Object {
$path = $_.FullName + «\AppData\Roaming\ICAClient»
write-host «DElete $path»
remove-Item $path -Recurse
$path = $_.FullName + «\AppData\Local\Citrix»
write-host «DElete $path»
remove-Item $path -Recurse
}
remove-Item «C:\ProgramData\Citrix\Подключаемый модуль Citrix для сетевых приложений» -Recurse

Далее, с помощью перечисления GUID, удаляется ThinPrint:

##Uninstall thin Print
$Guids=»7BDA669F-7154-4EDE-A426-BAD34EFF1702″, «9AD41A70-1C18-48BD-A527-F54E548D3886», «534ECE89-2EC5-451C-AB5B-4816DB86C05F», «B2A17DA7-F2CE-484A-89AB-5B4C064A8BF0», «2A749CB9-14CE-4FC8-A60F-A95DBCE0B7E4», «FE7EDAB1-AB21-4606-AB12-3CC45BF25718», «C23827F2-9883-4195-9D50-F81E923ED5B7»

ForEach ($Guid in $Guids)
{
$ArgumentList = «/x» + «{» + $Guid + «}» + » /qn REBOOT=ReallySuppress /quiet»
Start-Process -FilePath msiexec.exe -ArgumentList $ArgumentList -wait
write-host «Uninstall ThinPrint $ArgumentList»
}

Теперь устанавливаем Receiver:

##Install Receiver
$InstallFiles = «\\share\CitrixReceiverEnterprise.exe»
$ArgumentList = ‘/noreboot /silent /includeSSON ADDLOCAL=»ReceiverInside,ICA_Client,PN_Agent,SSON,USB,DesktopViewer,Flash,Vd3d» Enable_SSON=»Yes» Enable_KERBEROS=»No» LEGACYFTAICONS=»True» Enable_DYNAMIC_CLIENT_NAME=»Yes» ENABLEPRELAUNCH=»True» SERVER_LOCATION=»»‘
write-host «Starting Installation Receiver: $InstallFiles with argument: $ArgumentList»
Start-Process -FilePath $InstallFiles -ArgumentList $ArgumentList -wait

После установки Ресивера устанавливаем ThinPrint. Для этого я сделал два .mst файла с нужными настройками установки клиента печати. Одна версия для x32 и одна для x64. Проверяем разрядность системы и устанавливаем:

##Check System Info&Install ThinPrint
If ((Get-WmiObject Win32_OperatingSystem).OSArchitecture -match «64*»)
{
$Arguments = «/i `»\\ovsd\Soft\Thinprint Clients 10.0\ThinPrint Client Windows 10_x64.msi`» TRANSFORMS=`»\\ovsd\Soft\Thinprint Clients 10.0\ThinPrint10_x64.mst`» ALLUSERS=1 /qn»
}
Else
{
$Arguments = «/i `»\\ovsd\Soft\Thinprint Clients 10.0\ThinPrint Client Windows 10_x86.msi`» TRANSFORMS=`»\\ovsd\Soft\Thinprint Clients 10.0\ThinPrint10_x86.mst`» ALLUSERS=1 /qn»
}
write-host «Starting Installation Thinprint Arguments: $arguments»
start-process msiexec -arg $arguments -Wait

После того, как скрипт отработал, удаляем уведомление пользователя…:

##Remove User Notification

Remove-Item $Start
write-host «Удаляем $Start»

sendMail «Скрипт по обновлению клиента завершил работу на компьютере $env:computername » «Citrix Update Finished on $env:computername»

… и перезагружаем компьютер:

##Restart
write-host «Отправляем в перезагрузку комп..»
$d=get-date
write-host $d
Restart-Computer -force
}

Здесь, как раз, проверяется условие того, что уведомления для пользователя в автозагрузке нет:

##If File CitrixWait doesn’t Exist
If (!$Existlnk)
{

sendMail «Запустили первую часть скрипта на компьютере $env:computername» «Citrix Update 1st on $env:computername»

write-host «Не нашли ярлыка в автозагрузке»
$Citrix=»C:\tempOk»
$ExistTempok = test-path $Citrix
if (!$ExistTempok)
{
write-host «Не нашли папки $Citrix. Создаем… и копируем ярлык»
New-Item -ItemType Directory -Force -Path C:\TempOk
Copy-Item -Path «\\ovsd\Soft\CitrixWait2.exe» -Destination $Citrix
Copy-Item -Path «\\ovsd\Soft\CitrixWait2.lnk» -Destination «C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup»
}
if ($ExistTempok)
{
write-host «Нашли папку $Citrix. Копируем ярлык… »
Copy-Item -Path «\\ovsd\Soft\CitrixWait2.exe» -Destination $Citrix
Copy-Item -Path «\\ovsd\Soft\CitrixWait2.lnk» -Destination «C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup»
}
$d=get-date
write-host «Завершена работа первой части»
write-host $d
}
}
Else
{
write-host «Скрипт запускали, но старого клиента не нашли.»
sendMail «Скрипт запускали, но старого клиента не нашли. на компьютере $env:computername » «Citrix Update Empty on $env:computername»
Exit
}

Всё.

Изначально, скрипт был в три раза меньше и включал в себя только удаление и установку citrix/thinprint. Но затем скриптом заинтересовались админы и пошло-поехало. Уведомление пользователю, всяческие проверки версионности, логирование, отправка почты и т. д. В итоге, получилось то, что я описал выше.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s