Как вы получаете уникальный идентификатор клиента в Citrix XenApp 6.0? (MFCom с 4.0 и 4.5 не работает)

#client #unique #citrix #xenapp

#клиент #уникальный #citrix #xenapp

Вопрос:

В настоящее время для сервера презентаций 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?

Ответ №1:

Это довольно старое, но я продолжал сталкиваться с этим, когда хотел получить идентификатор клиента.

Имейте в виду, что идентификаторы клиентов из 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);
   }
}
  

Ответ №2:

Как вы правильно установили, MFCOM недоступен в XenApp 6. Таким образом, у вас остается два способа получения уникального идентификатора клиента:

  1. Используйте подсистему WMI Citrix.Из вашего приложения подключитесь к корневому пространству имен Citrix WMI и перечислите экземпляры класса MetaFrame_Session. Вы можете фильтровать по имени сервера (поскольку перечисление вернет все сеансы на всех серверах фермы, а не только на том, на котором вы запускаете приложение) и идентификатору сеанса. Экземпляры класса Metaframe_session содержат пару свойств, которые являются ссылками на экземпляры других классов; свойство Client ссылается на Metaframe_ICA_Client, а свойство SessionUser ссылается на Citrix_User. Metaframe_ICA_Client предоставляет вам IP-адрес клиента, имя хоста и несколько других параметров, которые вы могли бы объединить в качестве идентификатора.
    Однако в настоящее время в XenApp 6 обнаружена серьезная ошибка с подсистемой Citrix WMI, и попытка перечислить и создать экземпляры классов, на которые я ссылался выше (как обычный пользователь — администраторы в порядке), приводит к сбою не менее чем пятнадцати отдельных системных служб… Так что, возможно, нет.
  2. Альтернативой (и методом, который я использовал) было использование Citrix WFAPI SDK. Это неуправляемый код и немного свинячий, но здесь есть довольно хорошая статья об использовании WFAPI для получения сведений о клиенте.