Проблема
Имеем - ферма Xendesktop 7.6. VDA версии 7.6.300 и более ранних. В ферме опубликовано приложение explorer.exe, в котором открывается папка с ярлыками других приложений.
Возможны два варианта проблемы. Первый - при попытке запуска на сервере появляется сессия пользователя, которая сначала Logging on,затем Connected, потом на несколько секунд переходит в состояние Active (или не переходит), а потом сразу Logging Off. Без каких бы то ни было сообщений об ошибках. На сервере XenApp в журнале только два сообщения TdICA с кодами 1004 и 1007.
В журналах Citrix Reciever никаких ошибок нету. Глюк проявляется как на Windows, так и на Linux, а также тонких клиентах (Wyse и HP). На любых версиях Citrix Reciever (13 и 4.3.xxx), а также CitrixOnlinePlugin (версии 12.3 и других).
Второй вариант - сессия висит на сервере, но приложение в ней не запускается.
Что помогло мне при решении первой проблемы
Если сессия сразу закрывается, а в журнале только события 1004 и 1007, то делаем так.
В моем случае помогло остановка и выключение некоторых служб.
В первую очередь нужно остановить и выключить - Portable Device Enumerator Service.
Также хорошо бы выключить Net.Msmq Listener Adapter, Net.Pipe Listener Adapter, Net.Tcp Listener Adapter и Net.Tcp Port Sharing service.
Также Есть важный параметр в реестре. Написано тут:
http://discussions.citrix.com/topic/307554-sometimes-nothing-happes-after-starting-and-connecting-with-citrix-client/
По-умолчанию, таймаут запуска приложения - минута. Но иногда этого мало. Вероятная причина - задержки при логине на контроллере домена.
Решение описано у Citrix. Только нужно ставить длинный таймаут - минут 5.
На терминальном сервере в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Citrix\wfshell\TWI
создаем параметр
Name: ApplicationLaunchWaitTimeoutMS
Type: REG_DWORD
И даем ему значение 300000
Решение второй проблемы пустых сессий
В моем случае причиной того, что explorer.exe запускается, но окна не видно и сессия кажется “пустой”, стала невозможность корректной обработки logon-скриптов Windows, в которых прописано подключение сетевых дисков.
В структуре предприятия несколько доменов и при входе пользователей не из того домена, где размещены серверы, ресурсы, прописанные без указания FQDN не могли смонтироваться.
Помогло указание в свойствах сетевого подключения корректных DNS-суффиксов.
Без DNS-суффиксов, указанные в скриптах пути к ресурсам не резолвились и скрипты не могли корректно отработать, а окно explorer.exe не появлялось.
Всё, что написано ниже, может рассматриваться как часть Best Practices, но решением проблемы не является!!! |
---|
Что рекомендует Citrix
Citrix рекомердует открывать не explorer.exe, а Internet Explorer. То есть примерно так:
C:\Program Files\Internet Explorer\iexplore.exe -extoff "file://d:/path to folder"
Решение от Citrix
Вот тут написнао что публиковать Explorer.exe нехорошо:
http://support.citrix.com/article/CTX922603
Вот тут описаны варианты решения с помощью AutoIt: http://support.citrix.com/article/CTX131423 Фактически запускается Internet Explorer, затем explorer.exe, и потом Internet Explorer закрывается.
Вот тут не всегдя работающее решение с помощью правки реестра: http://support.citrix.com/article/CTX128009 http://support.citrix.com/article/CTX138069 http://support.citrix.com/article/CTX127883
В двух словах. В реестр на сервере Citrix Xenapp добавляем пару параметров:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Citrix\wfshell\TWI Name: ApplicationLaunchWaitTimeoutMS Type: REG_DWORD Data: <required additional time-out, in milliseconds> Note: Specifying a value of less than 10000 reverts to 10000 because 10 seconds is the minimum override. Method 2
И вот такой:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Citrix\wfshell\TWI Value Name: LogoffCheckerStartupDelayInSeconds Type: REG_DWORD Value: An integer that denotes the time to wait for the application to start (10 Hexadecimal recommended) Note: Setting this value also increases the time it takes for a user to log off the server.
Я сделал такой reg-файлик для всех серверов:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Citrix\wfshell\TWI] "ApplicationLaunchWaitTimeoutMS"=dword:00004e20 "LogoffCheckerStartupDelayInSeconds"=dword:00000015
Также есть такие рекомендации, котрые в моем случае не сработали:
1. Изменить строку запуска приложения на C:\Windows\explorer.exe /n ,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
2. Запускать Internet Explorer (“C:\Program Files (x86)\Internet Explorer\iexplore.exe” “C:\”) вместо explorer.exe “C:\”. Такой вариант также не привел к желаемым результатам. Часто окно Internet Explorer открывалось, но оставалось полностью белым (даже без кнопок).
Альтернатива Explorer.exe
Также во тут: https://community.spiceworks.com/topic/541368-issues-with-publishing-windows-explorer-citrix-xenapp-6-5-and-windows-2008-r2
сообщают об успешной публикации вместо Explorer.exe заменителя - Explorer++.exe: https://explorerplusplus.com/
Он действительно выглядит как обычный explorer, но заметно шустрее и компактнее.
Настраивается с помощью файлика .xml. Утащил к себе: explorer_1.3.5_x64.zip, explorer_1.3.5_x86.zip
Запуск explorer.exe при помощи скрипта vbs
Вот тут описано как с помощью скрипта vbs запускать один скрытый процесс и следом за ним какой-то другой http://www.norskale.com/articles/article/publish-and-application-that-needs-explorer-exe
' -------------------------------------------------------' Const strComputer = "." Const HIDDEN_WINDOW = 0 Const VISIBLE_WINDOW = 1 Const MyInitialProcess = "notepad.exe" Const MyApp = "calc.exe" Set objShell = Wscript.CreateObject("Wscript.Shell") Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!" & strComputer & " ootcimv2") Main() Sub Main On Error Resume Next Err.Clear MyPID = StartExProcess(MyInitialProcess,False) wscript.sleep 100 objShell.run MyApp , 1 , True wscript.sleep 100 TerminateExProcess MyInitialProcess,MyPID End Sub Function StartExProcess (sProcessName,Visible) On Error Resume Next Err.Clear Set objStartup = objWMIService.Get("Win32_ProcessStartup") Set objConfig = objStartup.SpawnInstance_ Select Case Visible Case True objConfig.ShowWindow = VISIBLE_WINDOW Case False objConfig.ShowWindow = HIDDEN_WINDOW End Select Set objProcess = GetObject("winmgmts:rootcimv2:Win32_Process") errReturn = objProcess.Create(sProcessName, null, objConfig, intProcessID) StartExProcess = intProcessID End Function Sub TerminateExProcess(sProcessName,sProcessID) On Error Resume Next Err.Clear strProcessName = Right(sProcessName, len(sProcessName) - instrrev(sProcessName, "")) Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & strProcessName & "'") For Each objProcess in colProcessList if objProcess.ProcessID = sProcessID then objProcess.Terminate() end if Next End Sub ' -------------------------------------------------------'
Открываем папку с помощью rundll32.exe
Также открывать папки можно с помощью вызова rundll32. Примерно так:
rundll32.exe url.dll,FileProtocolHandler "d:\Path to folder"
Итак. Публикуем приложение со следующими параметрами:
Path to executable:
%SystemRoot%\SysWOW64\rundll32.exe
Command Line Parameters:
url.dll,FileProtocolHandler "d:\Path to folder"
Working Directory:
%SystemRoot%
Discussion