Since the recent release of the Citrix HDX RealTime Optimization Pack for Lync, one of my colleagues Simon Pettit has been installing and configuring it on our development XenDesktop environment. The Citrix HDX RealTime Optimization Pack for Lync can be installed with both Citrix XenApp and Citrix XenDesktop. In our scenario we’re installing onto Citrix XenDesktop but it is equally applicable to Citrix XenApp. The installation has two install components:
- HDX RealTime Connector (HDX RealTime Connector LC.msi) that’s installed on the XenDesktop virtual machine;
- HDX RealTime Media Engine (Citrix HDX RealTime Media Engine.msi) that should installed on the endpoint device connecting the XenDesktop virtual machine.
Once Step 1 had been completed, we were then in a position to complete Step 2 – and this is where I started to have issues. No sooner had I started the installation I was faced with this warning message.
Now I knew for a fact that I had the Citrix Receiver installed and working so the warning message was infact lying!! – but why?
So I next decided to crack open the MSI, in one of my must have tools InstEd, and see what logic the MSI was using to determine why the Citrix Receiver wasn’t installed. The first place I always look is the CustomAction Table; this is where some ISVs love to try and cheat the built-in methods within the Windows Installer, i.e. using the AppSearch Table and a like. Please don’t use Custom Actions; I hate them with a passion?!
Looking in the CustomAction Table we can see two actions “CheckCitrixPluginVersion” and “CitrixPluginNotFound” which look like our culprits. You should also probably notice the source of all this evil is coming from the file “Install.vbs”.
The “Install.vbs” file can be found in the Binary table where such evils are normally hidden !! Now as this file is embedded into the MSI, we CAN’T easily see what logic the ISV has implemented. Did I mention, that this is why I hate them with a passion ?
Now luckily we can use InstEd to export the contents of the table by simply right clicking on the table and selecting “Export Table” (and selecting the location where to export the table to). If we now browse to the destination folder we will see a “Binary” (named after the table name) directory which will contain the files in the Binary table.
We can now open the file up in our favourite text editor and take a peek inside to see what’s going on. So lets look at the contents of this file:
[code]Sub CheckRunningApp()
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
Set colProcesses = objWMIService.ExecQuery _
(“SELECT * FROM Win32_Process WHERE ” & _
“Name = ‘MediaEngineHost.exe'”)
If colProcesses.Count > 0 Then
Session.Property(“APP_RUNNING”) = “1”
End If
End Sub
Sub CheckCitrixVersion()
Dim strComputer
Dim oReg
Dim strKeyPath
Dim strCitrixReceiverVersion
Dim strMinCitrixReceiverVersion
Dim strCitrixInstallFolder
Dim strKeyCitrixPathPath
Dim strKeyCitrixVerPath
Dim bHasAccess
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = “.”
strMinCitrixReceiverVersion=”11.2″
strCitrixReceiverVersion=””
strCitrixInstallFolder = “”
strKeyCitrixPathPath = “”
strKeyCitrixVerPath = “”
bHasAccess=false
Set oReg = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” & strComputer & “\root\default:StdRegProv”)
strKeyPath = “SOFTWARE\Wow6432Node\Citrix\ICA Client”
oReg.CheckAccess HKEY_LOCAL_MACHINE, strKeyPath, &H20000, bHasAccess
if (Err.number=0 and bHasAccess=true) Then
strKeyCitrixVerPath = “SOFTWARE\Wow6432Node\Citrix\InstallDetect\{A9852000-047D-11DD-95FF-0800200C9A66}”
strKeyCitrixPathPath = “SOFTWARE\Wow6432Node\Citrix\Install\ICA Client”
Else
Err.Clear
strKeyPath = “SOFTWARE\Citrix\ICA Client”
oReg.CheckAccess HKEY_LOCAL_MACHINE, strKeyPath, &H20000, bHasAccess
if (Err.number=0 and bHasAccess=true) Then
strKeyCitrixVerPath = “SOFTWARE\Citrix\InstallDetect\{A9852000-047D-11DD-95FF-0800200C9A66}”
strKeyCitrixPathPath = “SOFTWARE\Citrix\Install\ICA Client”
end if
end if
if(Err.number=0 and bHasAccess=true) then
oReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyCitrixVerPath, “DisplayVersion”, strCitrixReceiverVersion
if (StrComp(strCitrixReceiverVersion,strMinCitrixReceiverVersion)>=0) Then
Session.Property(“CITRIX_VERSION_112”) = “1”
Else
Session.Property(“CITRIX_VERSION_112”) = “0”
End If
Err.Clear
oReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyCitrixPathPath, “InstallFolder”, strCitrixInstallFolder
if (Err.number=0) Then
Session.Property(“CITRIX_PATH”) = strCitrixInstallFolder
else
Session.Property(“CITRIX_PATH”) = “0”
end if
else
Session.Property(“CITRIX_VERSION_112”) = “0”
Session.Property(“CITRIX_PATH”) = “0”
end if
End Sub
Sub SetMEHostLocationsValue()
installPath = Session.Property(“INSTALLDIR”)
If IsNull(installPath) Or Len(installPath) = 0 Then
Exit Sub
End If
locationsStr = Session.Property(“MEHOST_LOCATIONS_ENTRIES”)
If IsNull(locationsStr) Or Len(locationsStr) = 0 Then
newLocVal = installPath
tempVarStr = Session.Property(“%TEMP”)
If Not IsNull(tempVarStr) and Len(tempVarStr) > 0 Then
newLocVal = newLocVal + “;%TEMP%”
End If
Else
If InStr(locationsStr, installPath) = 0 Then
newLocVal = installPath + “;” + locationsStr
Else
newLocVal = locationsStr
End If
End If
Session.Property(“MEHOST_LOCATIONS_ENTRIES”) = newLocVal
End Sub[/code]
Now I’m not going to talk through the logic of the VBScript line by line as you can do that yourselves. However, I will draw your attention to these bits:
[code]strKeyPath = “SOFTWARE\Wow6432Node\Citrix\ICA Client”
oReg.CheckAccess HKEY_LOCAL_MACHINE, strKeyPath, &H20000, bHasAccess[/code]
And:
[code]strKeyPath = “SOFTWARE\Citrix\ICA Client”
oReg.CheckAccess HKEY_LOCAL_MACHINE, strKeyPath, &H20000, bHasAccess[/code]
You can see the VBScript is checking in HKEY_LOCAL_MACHINE for the existence of certain registry values that determine if the Citrix Receiver is installed (or not) and setting Windows Installer Properties that instruct the MSI to display the warning message we originally received.
Having now found out where it is determining this information, I checked those related HKLM registry keys on my local machine and surprise surprise, they weren’t there! So it’s taken me a while to find out why I’m getting the warning message (I could have potentially just used ProcMon when running the installer – but this blog also gives you some handy insight into the workings of Windows Installer ). Interestingly those very same registry keys are present in HKCU!
I hope you’re still with me? If you are, it begs the question “why when I installed the Citrix Receiver did these registry keys appear in HKCU?” If you were looking at the above screen shot very closely, you will also notice that the Citrix Receiver files are installed into my profile too!?
Well as it turns out the answer is simple, if not flawed in my view (but that’s another post). I installed the Citrix Receiver as my “standard” user account i.e. no admin privileges and as such the Citrix Receiver installed the files into my profile and registry keys into HKCU. The HDX RealTime Media Engine installer is obviously unaware that this is at all possible hence why its only checking HKLM.
So in conclusion, for the HDX RealTime Media Engine install to work without the warning message, you need to have installed the Citrix Receiver as an administrator. This will ensure the files are installed into either “%ProgramFiles%” or “%ProgramFiles(x86)%” and the registry keys into HKEY_LOCAL_MACHINE. If you’re (thinking of) operating a BYOC scheme you will probably need to be aware of this as your users won’t be and who knows what they’re doing!
Thanks for staying with me on this one – but I hope it was worth the wait .
Nathan