Как я могу удаленно запрашивать активность служб терминалов? - PullRequest
0 голосов
/ 09 февраля 2009

Я хочу запросить у наших серверов поиск отключенных / незанятых сессий. Я знаю, что могу использовать 'query.exe', но я бы предпочел что-то, с чем проще работать из кода.

WMI будет моим предпочтением.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2009

Для поиска вещей / генерации кода 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), и в любом случае вам потребуется «объединить» данные всех классов сеанса.

1 голос
/ 09 апреля 2009

Если вы используете язык .NET, вы можете попробовать Cassia . В C # код будет:

using System;
using Cassia;

namespace CassiaSample
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            ITerminalServicesManager manager = new TerminalServicesManager();
            using (ITerminalServer server = manager.GetRemoteServer("server-name"))
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    if ((session.ConnectionState == ConnectionState.Disconnected)
                        ||
                        (session.ConnectionState == ConnectionState.Active)
                        && (session.IdleTime > TimeSpan.FromMinutes(1)))
                    {
                        Console.WriteLine("Session {0} (User {1})", session.SessionId, session.UserName);
                    }
                }
            }
        }
    }
}

РЕДАКТИРОВАТЬ: Обновлен пример кода для Cassia 2.0.

...