Frage

Ich möchte unsere Server abfragen suchen getrennt / Sitzungen im Leerlauf zu sehen. Ich weiß, ich kann ‚query.exe‘, aber ich würde lieber etwas, das einfacher ist, mit von Code zu arbeiten.

WMI würde meine Präferenz sein.

Danke.

War es hilfreich?

Lösung

Wenn Sie eine .NET-Sprache verwenden, können Sie versuchen, Cassia . In C #, würde der Code:

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);
                    }
                }
            }
        }
    }
}

EDIT:. Aktualisiert Beispielcode für Cassia 2.0

Andere Tipps

Für Dinge / Erzeugen WMI Code und Abfragen zu finden, nutzen Sie die WMI-Code Creator . Es wird den Test Stubs (C #, VB.NET, VBScript) generieren und lassen Sie Abfragen testen, um sicherzustellen, dass sie die Informationen, die Sie wollen zurück.

Terminal Services Sachen unter dem Win32_Terminal * und Win32_TS * Klassen (Es gibt ein paar von ihnen, nicht sicher, was das ist, das Sie bekommen, was Sie brauchen.).

Ich benutze auch diese Hilfsklasse (braucht ein bisschen Refactoring, habe es nicht in Jahren berühren) Management-Objekte zu erhalten und Methoden ausführen.

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)
    }
}

@first Kommentar: Ick ... Anscheinend ist komplizierter als zunächst angenommen. Prüfen Sie diesen Artikel ( http://www.codeproject.com/KB/system/logonsessions. aspx ), im Abschnitt mit dem Titel " Was ist mit dem eingebauten in WMI-Funktion? ". Es gibt einige spezielle Handhabung erforderlich, wenn mit XP, da es verschiedene WMI-Provider-Klassen (ändern WMI-Code Schöpfer zu einem Remote-Computer-zu-Punkt - Ein Win2K3 Server zum Beispiel) hat, und in jedem Fall werden Sie brauchen, um „ein“ Daten von allen der Sitzung Klassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top