Для поиска вещей / генерации кода WMI и запросов получите WMI Code Creator . Он сгенерирует тестовые заглушки (C #, VB.NET, VBScript) и позволит вам тестировать запросы, чтобы убедиться, что они возвращают нужную вам информацию.
Службы терминалов в классах Win32_Terminal * и Win32_TS * (их несколько, но я не уверен, что именно они доставят вам то, что вам нужно.).
Я также использую этот вспомогательный класс (нуждается в некотором рефакторинге, не затрагивал его годами) для получения объектов управления и выполнения методов.
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
namespace MyWMI
{
public class WmiHelper
{
public static ManagementObjectCollection GetManagementObjectCollection(string ServerName, string WMIQuery)
{
//determine where the WMI root is that we will connect to.
string strNameSpace = "\\\\";
ConnectionOptions connectionOptions = new ConnectionOptions();
TimeSpan tsTimeout = new TimeSpan(0,0,5);
connectionOptions.Timeout = tsTimeout;
//if its not a local machine connection
if (ServerName.Trim().ToUpper() != Globals.HostName)
{
strNameSpace += ServerName;
connectionOptions.Username = Globals.WMIUserDomain + "\\" + Globals.WMIUserName;
connectionOptions.Password = Globals.WMIUserPass;
}
else
{ //we are connecting to the local machine
strNameSpace += ".";
}
strNameSpace += "\\root\\cimv2";
//create the scope and search
ManagementScope managementScope = new ManagementScope(strNameSpace, connectionOptions);
ObjectQuery objectQuery = new ObjectQuery(WMIQuery);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection returnCollection;
try
{
returnCollection = searcher.Get();
}
catch (ManagementException ex)
{
throw new SystemException("There was an error executing WMI Query. Source: " + ex.Source.ToString() + " Message: " + ex.Message);
}
//return the collection
return returnCollection;
} //eng GetManagementObjectCollection
public static bool InvokeWMIMethod(string ServerName, string WMIQueryToIsolateTheObject, string MethodName, object[] MethodParams)
{
//determine where the WMI root is that we will connect to.
string strNameSpace = "\\\\";
ConnectionOptions connectionOptions = new ConnectionOptions();
TimeSpan tsTimeout = new TimeSpan(0, 0, 5);
connectionOptions.Timeout = tsTimeout;
if (ServerName.Trim().ToUpper() != Globals.HostName)
{
strNameSpace += ServerName;
connectionOptions.Username = Globals.WMIUserDomain + "\\" + Globals.WMIUserName;
connectionOptions.Password = Globals.WMIUserPass;
}
else
{ //we are connecting to the local machine
strNameSpace += ".";
}
strNameSpace += "\\root\\cimv2";
ManagementScope managementScope = new ManagementScope(strNameSpace, connectionOptions);
ObjectQuery objectQuery = new ObjectQuery(WMIQueryToIsolateTheObject);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection returnCollection = searcher.Get();
if (returnCollection.Count != 1)
{
return false;
}
foreach (ManagementObject managementobject in returnCollection)
{
try
{
managementobject.InvokeMethod(MethodName, MethodParams);
}
catch
{
return false;
}
} //end foreach
return true;
} //end public static bool InvokeWMIMethod(string ServerName, string WMIQueryToGetTheObject, string MethodName, object[] MethodParams)
}
}
@ Первый комментарий:
Я ... Видимо, это сложнее, чем казалось на первый взгляд. Прочтите эту статью (http://www.codeproject.com/KB/system/logonsessions.aspx), в разделе, озаглавленном « Как насчет встроенной функциональности WMI? ». При использовании XP требуется особая обработка, поскольку у него есть разные классы провайдера WMI ( измените WMI Code Creator так, чтобы он указывал на удаленный компьютер (например, на сервер Win2K3), и в любом случае вам потребуется «объединить» данные всех классов сеанса.