Tommo asked me is it a quick job to use MFCOM to send message to everyone on one server before scheduled reboot. I quickly checked MFCOM language reference, and found one method:
SendMessage.
Findings: when listing sessions, farm-widely, you will get all user sessions, such as ObjFarm.Sessions. But listing sessions by server, as ObjServer.Sessions, it will list the following sessions as well:
Console
ICA-tcp (session id 65536 listening)
RDP-tcp (session id 65537 listening)
So in the following script, I have to use to If/elseif to include only session with active state and with non-empty username.
Code:
<package> | |
<job id="MFCOM_Send_Message"> | |
<comment> | |
File: MFCOM_Send_Message.wsf | |
Description: Send Message to users who have active sessions on the server. | |
Requirements: WSH 5.5 or higher. | |
Created: 20/5/2008 | |
Author: Paullo | |
| |
| |
SendMessage Parameters: | |
| |
ServerName | |
SessionID | |
UserName | |
ClientName | |
Title | |
Message | |
MessageStyle 0 = OK Button Only | |
Timeout Display time in milliseconds | |
WaitingTime Waiting for response time in milliseconds | |
| |
</comment> | |
<runtime> | |
<description> | |
Send Message to users. | |
</description> | |
<example> | |
CScript //nologo MFCOM_Send_Message.wsf SERVERNAME | |
</example> | |
</runtime> | |
<reference object="MetaFrameCOM.MetaFrameFarm"/> | |
<script language="VBScript"> | |
Dim ArgObj, ServerName, ObjServer, ObjSessions, ObjSession | |
| |
Set ArgObj = WScript.Arguments | |
ServerName = ArgObj(0) | |
| |
WScript.Echo "Server Name: " & ServerName | |
| |
Set ObjServer = CreateObject("MetaFrameCOM.MetaFrameServer") | |
ObjServer.Initialize 6, ServerName | |
| |
For Each ObjSession in ObjServer.Sessions | |
SessionID = ObjSession.SessionID | |
UserName = ObjSession.Username | |
ClientName = ObjSession.ClientName | |
strTitle = "System Maintenance Reminder" | |
strMsg = "Please log off in 5 minutes due to regular system maintenance." | |
SessionState = ObjSession.SessionState | |
| |
' WScript.echo "SessionID = " & SessionID & "; UserName = " & UserName & "; ClientName = " & ClientName & "; SessionState = " & SessionState & ";" | |
| |
If UserName = "" Then | |
' When listing sessions for a server, it is listing the listening sessions as well. | |
Elseif SessionState <> 1 Then | |
' Only send message to Active Sessions | |
Else | |
ObjSession.SendMessage ServerName,SessionID, UserName, ClientName, strTitle, strMsg, 0, 120000, 120000 | |
End If | |
Next | |
| |
| |
</script> | |
</job> | |
</package> |
Noobs,
Finally worked out why our External WI’s where prompting authentication information on subsequent loading of the same published application. (Hope that makes sense. Little more info below if you are thinking, WTF)
Background Information:
Due to system setup, the Java client is our only means of connection via the Juniper appliances. So we have setup Web Interface 4.2, JICA 9.5.18x with JRE 1.x.x. (as java client depends on the runtime environment installed on client PC, and we have NO control over what version of JRE customer install on there home PC/netcafe’ so on).
Symptoms:
User’s connects to External WI (default client = Java), authenticates and Published Applications are displayed.
i. User select Published Resource #1
ii. Published Resource #1 loads and pass-through all authentication information.
iii. User logs off Published Resource #1 gracefully
iv. User then loads Published Resource #1 again, this time they are prompted with the Windows Authentication.
When the above prompt is displayed the target server records an “event log” for wsxica. Stating the ticket was invalid.
So, what does the above event log mean?
It is stating that the the same WI ticket is been used for a separate instance of the published resource.
So why?
It seems the newer version of JAVA runtime 1.6.x does not clean up or remove the old URL cache, this is what it should be doing after each published resource is launched.
network: Remove cache entry: http://servername/Citrix/Metaframe/site/launch.ica?NFuse_UID=1&NFuse_Application=Citrix.MPS.App.Oceania.Network+Desktop+-+TIP106
Workaround:
1. Disable the Java cache on the client PC.
2. Use older version of JRE 1.5.x (I have not complied a list of compatiably JRE’s yet).
Advanced Diagnostics:
When using the JICA client, it does not store a launch.ica file in the user temp settings like the local client does.
C:\Documents and Settings\%username%\Local Settings\Temp\Temporary Internet Files\Content.IE5\
JICA cache the files on the WI itself;
network: Cache entry found [url: http://servername/Citrix/Metaframe/ICAWEB_common/icajava/JICA-coreN.jar, version: null]
network: Remove cache entry: http://servername/Citrix/Metaframe/site/launch.ica?NFuse_UID=1&NFuse_Application=Citrix.MPS.App.Oceania.Network+Desktop+-+TIP106
network: Cache entry not found [url: http://servername/Citrix/Metaframe/site/launch.ica?NFuse_UID=1&NFuse_Application=Citrix.MPS.App.Oceania.Network+Desktop+-+TIP101, version: null]
network: Connecting http://servername/Citrix/Metaframe/site/launch.ica?NFuse_UID=1&NFuse_Application=Citrix.MPS.App.Oceania.Network+Desktop+-+TIP101 with proxy=DIRECT
As you can see above it is stored on the WI were http://servername is the name of our WI.
A chat led to our discussion on the role of Data Store. Question:
When user launches Citrix Web Interface, where does the Web Interface server get the application list?
Answer: Citrix Web Interface server gets a list of applications for the user from the server defined in Web Interface site properties.
Good, your answer is correct. Then next:
When Web Interface server is requesting application list, where does the application server get the data? From Data Store or itself (Local Host Cache)?
My instinct was that Citrix server would use IMA to talk to Datastore to get the application list. Tommo thought another possibility was the server would search it Local Host Cache which is a copy of Data Store. The reason is Citrix Servers are functioning if data store is not available.
Testing:
1. Rename MF20.dsn on Citrix server that is listed in Web Interface site properties: Web Interface still works.
2. Stop SQLServer service: Web Interface still works.
3. Running Wireshark during Web Interface logon and listing applications, the Citrix server does not talk to data store during the period Web Interface server displaying the list of applications.
Answer: Citrix application server is self contained, will search farm data from local host cache first. It will update local host cache by polling interval defined in Registry, default is 30 minutes.
Registry Key related to this post:
HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\IMA\
DWORD: DCNChangePollingInterval
Value: 0x1B7740 (default 1,800,000 milliseconds)
(Reference: http://support.citrix.com/article/CTX111914)
Well, 7 hours has passed and finally got Edgesight reports and custom reports working again. Talk about a mission considering I did not have access to the SQL Dev server where the database is pointing it, it was a nightmare. Here’s what happened.
Created a customer report to filter out external users from the “ICA Latency report for user group” (fortunately enough our external web interface gives client name “R_") so we can filter out remote user’s and only take internal web interface users by using the below command.
and Left(cs.client_name,1) != ‘R’
Okay, so I got my custom report, I decide to upload it via the Edgesight console:
Company Settings -> Server -> Reporting -> Upload Report.
Now at this point I uploaded the report and check to make sure all looked good under:
http://edgesightservername/reports
Navigated to the following directory: Home > Citrix > EdgeSight > 5C0B0458-F8AB-49F5-B99E-20F7F1DEF1FA > Custom_1
Okay, so far so good. BUT I notice the properties where wrong when I uploaded the report.
Example 1.1
Network Volume Peak-Avg for a Process by Day and Site
Data Area: Network
Data Type: Network Volume
Selected Type: Application
Group By: Day
Report Type: Chart
Visibility: Public
So I deleted the report directly from the Reports server folder. Which you can do when you select “show details".
Went back into my Edgesight Console and select “Custom Reports” - OOO SH*T ![]()
Server Error in ‘/Edgesight’ Application.
——————————————————————————–
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
WTF, Happen? well I dunno. Edgesight freaked out, maybe cause of a duplicate report name? I am sure I changed it to something else?
After many hours of searching I found the following CTX Article (CTX110998) HERE on a post further down by Paullo, talk about a Noob -LOL
anyway MANUALLY uploaded all Custom reports again
I replicated the issue twice and logged call to Citrix.
Suddenly I have an urge to change all DHCP enabled Citrix server to fixed IP addresses. Don’t laugh, in 2008, people still run server with DHCP on and the server is a Citrix Presentation Server. But we do, as these servers are in VM space and mainly for testing / development purpose.
Script 1: F_GetNetworkConfiguration.ps1
function DisplayNetworkConfiguration ($ServerName)
{
Write-Host $ServerName
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE –ComputerName $ServerName
}
Script 2: GetCTXNetConf.ps1
. c:\source\scripts\powershell\F_GetNetworkConfiguration.ps1
$objFarm = New-Object -ComObject MetaFrameCOM.MetaFrameFarm
$objFarm.Initialize(1)
Write-Host $objFarm.FarmName
$objServers = $objFarm.Servers
# The following lists each server name and DHCP status
# The first line give more detais, while the second line
# gives only server name and DHCP status.
$objServers | ForEach-Object {DisplayNetworkConfiguration ($_.ServerName)}
$objServers | ForEach-Object {DisplayNetworkConfiguration ($_.ServerName)}|Select-Object -Property DHCPEnabled
Brief Intro:
1. Problem: EdgeSight not working after SQL Server 2005 Upgrade
2. EdgeSight Version: V4.5 SP4(S17)
This week, we have upgraded SQL Server 2000 to 2005. The server is hosting Citrix DataStore, Resource Manager Database, EdgeSight Database, and Reporting Server for EdgeSight.
Nothing was planned to be broken and anything broken is not a surprise.
After the in-place upgrade, DataStore and RM Database works fine without causing any problems yet. Reporting Services not working anymore. Hard search on Google returned the following links which pointing the failure to the upgrade script.
http://www.developmentnow.com/g/115_2007_8_0_0_1012756/Upgrading-to-RS2005.htm
http://www.mydatabasesupport.com/forums/ms-sqlserver/246422-upgrading-rs2005.html
To build a new EdgeSight database is not an option within a day, as people waiting to produce the reports. I finally worked out to separate the Reporting Services to another SQL Server 2005 (which was a new installation on Virtual Server) and fixed the problem:
1. Created local user RSUSER on NEW_DB
2. Configured http://NEW_DB/Reports Site Settings, added RSUSER administrator of Reporting Service according to EdgeSight Report Service Configuration Guide
3. EdgeSight Web Configuration - Server Settings - Reporting Services, change the Report Server URL to http://NEW_DB/ReportServer and updated Report Server Settings. This step has uploaded all reporting templates to NEW_DB.
4. Followed http://support.citrix.com/article/CTX110998 to fix issues when loading some reports.
Yes, we will need to do more: Uninstall and reinstall the Reporting Services when there is an opportunity and move the Reporting Services back. This is beefy 8 core machine.
Hi We call us Citrix Noobs, because we are noobs. We are a group of noobs that is heckless and restless. We are not fearing of anything, and we tend to do the best in daily noobing. Join us if you are also noobs, and will keep noobing.
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
|---|---|---|---|---|---|---|
| << < | Current | > >> | ||||
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 | |