воскресенье, 14 июня 2015 г.

Корректное обновление Citrix Receiver

Доброго времени суток, коллеги.
В данной статье рассмотрим корректное обновление клиента Citrix Receiver, с полным вычищением пользовательских настроек.

По теории возможно корректно удалить Citrix Receiver воспользовавшись утилитой Receiver Clean-Up Utility, которая корректно не только удалит само приложение, но и вычистит все пользовательские настройки Receiver'а, а потом спокойно установить новую версию Receiver'a с необходимыми параметрами. Это идеальный случай, когда на данном компьютере работает только один пользователь, обладающий правами локального администратора. В реалии все бывает немного по-другому.
В данной статье рассмотрим три случая обновления Citrix Receiver'а:
  1. Простое обновление Receiver используя CMD.
  2. Обновление Receiver с вычищением настроек пользователей используя PowerShell.
  3. Обновление Receiver с вычищением настроек пользователей используя PowerShell запущенный под пользовательской учетной записью.

Необходимые требования:
  1. PowerShell
  2. Включенный параметр "Set-ExecutionPolicy Unrestricted" разрешающий выполнение PowerShell скриптов.

1. Рассмотрим простейший пример скрипта корректной установки Receiver, используя командную строку CMD.
Логика:
  1. Корректное удаление предыдущего Ресивера посредством утилиты Receiver Clean-Up Utility
  2. Установка Ресивера с необходимыми нам параметрами

Поместим приложения Ресивер "CitrixReceiver.exe" и "ReceiverCleanupUtility.exe" в одну папку, там же создадим файл CMD со следующим содержанием:

"%~dp0ReceiverCleanupUtility.exe" /silent
#где %~dp0 это путь к текущей директории
"%~dp0CitrixReceiver.exe" /includeSSON ENABLE_SSON="Yes" /ALLOWADDSTORE=a STORE0="TEST;http://ven-tst-sf01/Citrix/PNAgent1/config.xml;on;" /silent

Описание параметров можно посмотреть тут.
Данный скрипт корректно вычистит все параметры старого плагина Citrix и установит новый Citrix Receiver с новыми необходимыми настройками.

2.Обновление Receiver с вычищением настроек пользователей используя PowerShell.

Если за данным компьютером работают несколько пользователей, например, это компьютер кассиров, операционистов и т.п., то данный скрипт вычистит все параметры только текущего пользователя, а остальные пользователи, войдя в данный компьютер под своими учетными данными увидят "удвоенные" учетные записи, фантомные ярлыки приложений и т.п.
Для этого придется усовершенствовать скрипт, используя PowerShell.
Логика скрипта:
  1. Узнаем количество пользователей на локальном компьютере
  2. Загружаем реестр каждого пользователя, удаляем необходимые нам ветки реестра, выгружаем реестр.
  3. Удаляем ресивер, используя Receiver Clean-Up Utility.
  4. Устанавливаем Citrix Receiver с необходимыми параметрами
  5. Удаляем настройки пользователя текущего пользователя, не обладающего административными привилегиями.

Приведу листинг скрипта:

1. Узнаем количество пользователей на локальном компьютере

#Используя класс "win32_userprofile" наполняем переменную $Profile_Path списком localPath пользователей. Шаблон C:\Users\%username%. Подробнее тут (Тут https://msdn.microsoft.com/en-us/library/ee886409(v=vs.85).aspx)
$Profile_Path=gwmi win32_userprofile | select localpath
#Выводим значение переменной $Profile_Path
$Profile_Path
#Узнаем количество профилей на данном компьютере и приравниваем переменной $NUM
$NUM=$Profile_Path.count
#Удаляем сервисные учетные записи Windows
$NUM -= 3
#Выводим значение переменной
$NUM

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

for
($i = 0; $i -lt $NUM; $i++)
{
$i
#Присваиваем переменной $username имя пользователя соответствующее значению номера строки переменной "$Profile_Path" взятое по столбцу "Name
$username=($Profile_Path[$i].Name)
#Присвоиваем переменной "$LAOD" значение загрузки куста HKEY_USERS реестра пользователя
$LOAD = '"HKEY_USERS\'+$username+'" "'+$Profile_Path[$i].localpath+'\NTUSER.DAT"'
#Присваиваем переменной "$DELETE_ST" значение ветви реестра пользователя с настройками учетных записей Receiver, которую нужно удалить
$DELETE_ST = '"HKEY_USERS\'+$username+'\Software\Citrix\Dazzle\Sites"'
#Присваиваем переменной "$DELETE_RS" значение ветви реестра пользователя с настройками учетных записей Receiver, которую нужно удалить
$DELETE_RS = '"HKEY_USERS\'+$username+'\Software\Citrix\Receiver\RS"'  
#Присваиваем переменной "$DELETE_CS" значение ветви реестра пользователя с настройками избранных приложений, добавленных на рабочую панель Receiver’а, которую нужно удалить
$DELETE_CS = '"HKEY_USERS\'+$username+'\Software\Microsoft\Windows\CurrentVersion\Uninstall"'     
#Выгружаем куст. 
$UNLOAD = '"HKEY_USERS\'+$username+'"'
#Выполняем
Reg load $LOAD
$LOAD
Reg delete $DELETE_ST /f
$DELETE_ST
Reg delete $DELETE_RS /f
$DELETE_RS
Reg delete $DELETE_CS /f
$DELETE_CS
Reg unload $UNLOAD
$UNLOAD
}

Если установлена ОС ниже Windows Vista, можно использовать командлет "Get-ChildItem", подробнее тут.

#Присваиваем переменной "$Profile_Path " значения списка папок пользователей по пути "C:\Users". Для WinXP - "C:\Documents and Settings"
$Profile_Path = Get-ChildItem -force "C:\Users"
#Далее по аналогии
$Profile_Path | select Name
$NUM=$Profile_Path.count
$NUM
for ($i = 0; $i -lt $NUM; $i++)
{
$i
$username=($Profile_Path[$i].Name)
$LOAD = '"
HKEY_USERS\'+$username+'" "'+$Profile_Path[$i].localpath+'\NTUSER.DAT"'
$DELETE = '"
HKEY_USERS\'+$username+'\Software\Citrix\Dazzle\Sites"'
$DELETE_RS = '"
HKEY_USERS\'+$username+'\Software\Citrix\Receiver\RS"'      
$DELETE_CS = '"
HKEY_USERS\'+$username+'\Software\Microsoft\Windows\CurrentVersion\Uninstall"'      
$UNLOAD = '"
HKEY_USERS\'+$username+'"'
Reg load $LOAD
$LOAD
Reg delete $DELETE /f
$DELETE
Reg delete $DELETE_RS /f
$DELETE_RS
Reg delete $DELETE_CS /f
$DELETE_CS
Reg unload $UNLOAD
$UNLOAD
}

3. Удаляем ресивер, используя Clean-Up Utility.

#Присваиваем переменной "$Loc" значение пути до текущей папки
$Loc = Get-Location
#Присваиваем переменной "$Location" значение выборки переменной "$Loc" взятое по столбцу "path"
$Location = $Loc.path
#Выводим строку 'Uninstall Receiver'
$Log = 'Uninstall Receiver'
$Log
#Запускаем утилиту ReceiverCleanupUtility
$ClenUp = $Location+'\ReceiverCleanupUtility.exe'
$ClenUp
$CleanUPArg = '
/silent'
& $ClenUp $CleanUPArg

4. Устанавливаем Receiver с определенными параметрами

$Log = 'Install Receiver'
$Log
$Receiver = $Location+'
\CitrixReceiver.exe'
$Receiver
$Receiverarg1 = '
/includeSSON'
$Receiverarg2 = '
ENABLE_SSON="Yes"'
$Receiverarg3 = '
/ALLOWADDSTORE=a'
$Receiverarg4 = '
STORE0="TEST; http://ven-tst-sf01/Citrix/PNAgent1/config.xml;on;"'
$Receiverarg5 = '
/silent'
& $Receiver $Receiverarg1 $Receiverarg2 $Receiverarg3 $Receiverarg4 $Receiverar5

Сохраним скрипт в файл под именем «Install.ps1»

5. Для удаления и установки Receiver'а требуются административные права. Поэтому очень часто технические специалисты запускают скрипты, находясь под окружением обычного пользователя, повышая его привилегию, используя инструмент «Run As».
В этом случае настройки текущего пользователя не будут сброшены. Для очистки настроек необходимо запустить еще один скрипт под правами текущего пользователя:
#Убиваем процессы Receiver'а
Stop-Process -processname Receiver*
Stop-Process -processname SelfService*
Stop-Process -processname wfcrun32*
#Присваиваем переменной "$objUser" значение имени текущего пользователя, используя параметр "Whoami"
$objUser = New-Object System.Security.Principal.NTAccount(whoami)
#Присваиваем переменной "$strSID" значение SID'а текущего пользователя
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
#Присваиваем переменной "$UserSID" значение SID'а теущего пользователя по столбцу "Value"
$UserSID=$strSID.Value
$
UserSID
#Удаляем Ветки реестра текущего пользователя
$DELETE = '"HKEY_USERS\'+$UserSID+'\Software\Citrix\Dazzle\Sites"'
$
DELETE_Curr = '"HKEY_CURRENT_USER\Software\Citrix\Dazzle\Sites"'
$
DELETE_Rec = '"HKEY_CURRENT_USER\Software\Citrix\Receiver\SR"'
$
DELETE_sidrec = '"HKEY_USERS\'+$UserSID+'\Software\Citrix\Receiver\SR"'
$
DELETE_cach = '"HKEY_USERS\'+$UserSID+'\Software\Microsoft\Windows\CurrentVersion\Uninstall"'
Reg delete $DELETE_cach /f
$
DELETE_cach
Reg delete $DELETE_sidrec /f
$
DELETE_sidrec
Reg delete $DELETE /f
$
DELETE
Reg delete $DELETE_Rec /f
$
DELETE_Rec
Reg delete $DELETE_Curr /f
$
DELETE_Curr

3. Упростим скрипт до одного исполняемого файла.

Логика работы:
  1. Скрипт вычищает настройки Receiver текущего пользователя
  2. Повышает административные привилегия, запрашивая логин и пароль
  3. Под административными привилегиями запускается скрипт для удаления, вычищения и установки Receiver

#Запуск скрипта от имени текущего пользователя
Stop-Process -processname Receiver*
Stop-Process -processname SelfService*
Stop-Process -processname wfcrun32*
$objUser =
New-Object System.Security.Principal.NTAccount(whoami)
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$UserSID=$strSID.Value
$UserSID
$DELETE = '"
HKEY_USERS\'+$UserSID+'\Software\Citrix\Dazzle\Sites"'
$DELETE_Curr = '"
HKEY_CURRENT_USER\Software\Citrix\Dazzle\Sites"'
$DELETE_Rec = '"
HKEY_CURRENT_USER\Software\Citrix\Receiver\SR"'
$DELETE_sidrec = '"
HKEY_USERS\'+$UserSID+'\Software\Citrix\Receiver\SR"'
Reg delete $DELETE /f
$DELETE
Reg delete $DELETE_Curr /f
$DELETE_Curr
Reg delete $DELETE_Rec /f
$DELETE_Rec
Reg delete $DELETE_sidrec /f
$DELETE_sidrec
#Запускаем PowerShell с указанием пути до второго скрипта от имени введенных административных учетных данных.
#Узнаем путь до текущей папки
#Присваиваем переменной "$Loc" значение пути до текущей папки
$Loc = Get-Location
#Присваиваем переменной "$Location" значение выборки переменной "$Loc" взятое по столбцу "path"
$Location = $Loc.path
#Присваиваем переменной "$inst" путь до скрипта «Install.ps1»
$inst = '-File "'+$Location+'\Install.ps1"'
$inst
#Присваиваем переменной "$usr" значение учетных данных, введенных администратором.
$usr = Get-Credential
#Запускаем консоль PowerShell под учетными данными администратора
Start-Process powershell.exe -Credential $usr -ArgumentList $inst -NoNewWindow

Скрипт "Install.ps1" приведён выше. Сохраним скрипт в файл под именем «CleanReg.ps1»
Теперь для простоты запуска создадим файл "Install.cmd" с содержанием:
powershell.exe -file .\CleanReg.ps1
Итого, в папке должно находиться пять файлов:
"Install.cmd" - Файл запуска скрипта PowerShell
"CleanReg.ps1" - Скрипт, очищающий настройки Receiver'a текущего пользователя
"Install.ps1" - Скрипт, очищающий настройки Receiver'а всех пользователей на данном компьютере, удаление и установка Receiver
"CitrixReceiver.exe" - Дистрибутив установки Citrix Receiver
"ReceiverCleanupUtility.exe" - Дистрибутив удаления Citrix Receiver: Citrix CleanUp Utility
Архив можно скачать отсюда.

На этом предлагаю закончить.
Вопросы, замечания и предложения пишите в комментариях или на почту.
Удачного тестирования!