Как получить уникальный идентификатор клиента в Citrix XenApp 6.0? (MFCom от 4.0 и 4.5 не работает)
В настоящее время для Presentation Server 4.0 и 4.5 я получаю уникальный идентификатор клиента через MFCom в C# .NET.
MetaFrameFarm farm = new MetaFrameFarm();
farm.Initialize(MetaFrameObjectType.MetaFrameWinFarmObject);
foreach (MetaFrameSession session in farm.Sessions)
{
clientId = session.ClientID;
.....
Я начал получать тестирование ошибок на 6.0. Строка, о которой идет речь, является неудачной - это первая строка для создания объекта 'ферма' выше.
Посмотрев онлайн я нашел это...
Начиная с XenApp 6.0, MFCOM как общедоступный интерфейс программирования и создания сценариев больше не будет доступен. Весь существующий код на основе MFCOM больше не работает в XenApp 6.0. Нет сомнений в том, что отсутствие MFCOM потребует дополнительных усилий для принятия XenApp 6.0.
Есть ли способ получить уникальный идентификатор клиента в 6.0?
2 ответа
Это довольно старый, но я продолжал сталкиваться с этим, когда я хотел получить clientID.
Имейте в виду, что идентификаторы клиентов из 4.X не совпадают с форматом 6.X. Это касается примерно всех идентификаторов, приложения и сервера:
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
PSSnapInException ex;
rs.RunspaceConfiguration.AddPSSnapIn("Citrix.XenApp.Commands", out ex);
ps.AddCommand("GET-XASession").AddParameter("Full");
foreach (PSObject Session in ps.Invoke())
{
try
{
ClientID = Convert.ToString(Session.Properties["ClientId"].Value);
Console.WrileLine(ClientID);
}
catch (Exception e)
{
WriteError.WriteEntry("Client Failure " + e.Message + EventLogEntryType.FailureAudit);
}
}
Как вы правильно установили, MFCOM недоступен в XenApp 6. Итак, у вас есть два способа получить уникальный ClientID:
- Используйте подсистему Citrix WMI. Из вашего приложения подключитесь к пространству имен Root\Citrix WMI и перечислите экземпляры класса MetaFrame_Session. Вы можете выполнить фильтрацию по имени сервера (так как перечисление вернет все сеансы на всех серверах фермы, а не только на том, на котором запущено приложение) и по идентификатору сеанса. Экземпляры класса Metaframe_session содержат несколько свойств, которые являются ссылками на экземпляры других классов; свойство Client ссылается на Metaframe_ICA_Client, а свойство SessionUser ссылается на Citrix_User. Metaframe_ICA_Client дает вам IP-адрес клиента, имя хоста и некоторые другие вещи, которые вы можете объединить в качестве идентификатора.
Однако в настоящее время XenApp 6 имеет серьезную ошибку с подсистемой WMI Citrix, и попытка перечислить и создать экземпляры классов, на которые я ссылаюсь выше (как обычный пользователь - администраторы в порядке), приводит к сбою не менее пятнадцати отдельных системных служб... Так что, возможно, нет. - Альтернативой (и техникой, которую я использовал) было использование Citrix WFAPI SDK. Это неуправляемый код и немного свирепый, но здесь есть довольно хорошая статья об использовании WFAPI для получения сведений о клиенте.