Exportar (0) Imprimir
Expandir todo

Cómo conectarse a un equipo remoto

.NET Framework 2.0

WMI está diseñado para supervisar el hardware y el software en equipos remotos. Las conexiones remotas para WMI en .NET Framework se realizan a través del objeto ManagementScope.

Para la conexión remota con clases en el espacio de nombres System.Management se utiliza DCOM como mecanismo remoto subyacente. Las conexiones WMI remotas deben ajustarse a los requisitos de seguridad de DCOM por lo que respecta a la suplantación y la autenticación. Para conexiones entre sistemas operativos diferentes (por ejemplo, una conexión iniciada desde un equipo Windows 2000 con un equipo Windows Server 2003), pueden ser necesarios niveles de suplantación y autenticación distintos que para una conexión entre dos equipos Windows 2000. Para obtener más información, vea el artículo (en inglés) sobre la conexión a WMI en un equipo remoto, en la documentación referente a Instrumental de administración de Windows de MSDN Library, que se encuentra en la dirección http://msdn.microsoft.com/library.

De forma predeterminada, un ámbito está enlazado al equipo local y al espacio de nombres del sistema root\cimv2. Sin embargo, se puede cambiar el espacio de nombres en la cadena que especifica la ruta de acceso al constructor o bien utilizar un objeto ManagementPath. La cadena utilizada para la ruta de acceso sigue las mismas reglas que en el caso de otras rutas de acceso WMI y se deben emplear caracteres de escape con las barras diagonales inversas (\). Para obtener más información, vea la descripción (en inglés) de la ubicación de objetos WMI, en la documentación referente a Instrumental de administración de Windows de MSDN Library, que se encuentra en la dirección http://msdn.microsoft.com/library.

Además, cuando conecte remotamente, podrá especificar credenciales para cualquier otro usuario que no sea el que ha iniciado la sesión en curso y las operaciones en el equipo remoto se realizarán en el contexto del usuario especificado. Para ello, se puede emplear un objeto ConnectionOptions.

Ejemplo

En el siguiente ejemplo de código se establece una conexión con un equipo remoto del mismo dominio que el del usuario y se muestra información acerca del sistema operativo del equipo remoto. El usuario debe ser administrador en el equipo remoto para que pueda establecerse la conexión.

using System;
using System.Management;
public class RemoteConnect 
{
    public static void Main() 
    {
        /*// Build an options object for the remote connection
        //   if you plan to connect to the remote
        //   computer with a different user name
        //   and password than the one you are currently using
          
             ConnectionOptions options = 
                 new ConnectionOptions();
                 
             // and then set the options.Username and 
             // options.Password properties to the correct values
             // and also set 
             // options.Authority = "ntdlmdomain:DOMAIN";
             // and replace DOMAIN with the remote computer's
             // domain.  You can also use kerberose instead
             // of ntdlmdomain.
        */

        // Make a connection to a remote computer.
        // Replace the "FullComputerName" section of the
        // string "\\\\FullComputerName\\root\\cimv2" with
        // the full computer name or IP address of the
        // remote computer.
        ManagementScope scope = 
            new ManagementScope(
                "\\\\FullComputerName\\root\\cimv2");
        scope.Connect();

        // Use this code if you are connecting with a 
        // different user name and password:
        //
        // ManagementScope scope = 
        //    new ManagementScope(
        //        "\\\\FullComputerName\\root\\cimv2", options);
        // scope.Connect();

        //Query system for Operating System information
        ObjectQuery query = new ObjectQuery(
            "SELECT * FROM Win32_OperatingSystem");
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher(scope,query);

        ManagementObjectCollection queryCollection = searcher.Get();
        foreach ( ManagementObject m in queryCollection)
        {
            // Display the remote computer information
            Console.WriteLine("Computer Name : {0}", 
                m["csname"]);
            Console.WriteLine("Windows Directory : {0}", 
                m["WindowsDirectory"]);
            Console.WriteLine("Operating System: {0}",  
                m["Caption"]);
            Console.WriteLine("Version: {0}", m["Version"]);
            Console.WriteLine("Manufacturer : {0}", 
                m["Manufacturer"]);
        }
    }
}

El objeto ConnectionOptions controla también los niveles de suplantación y autenticación utilizados por WMI en las operaciones remotas con DCOM. Las configuraciones predeterminadas de estos parámetros son Impersonate y Unchanged, respectivamente.

El valor Unchanged significa que el cliente toma de forma predeterminada los requisitos de autenticación del servidor, utilizando el proceso estándar de negociación DCOM. En Windows 2000, Windows NT 4.0 y Windows 98, el servicio WMI requerirá autenticación de nivel de conexión, mientras que en Windows XP Home Edition, Windows XP Professional, Windows Server 2003 y Windows Server 2003 será necesaria la autenticación del nivel de paquete. Si el cliente requiere una configuración de autenticación específica, la propiedad de autenticación en el objeto ConnectionOptions se puede utilizar para controlar el nivel de autenticación en esta conexión concreta.

El valor Impersonate significa que el cliente permite al proveedor de datos de WMI que suplante su identidad cuando reúna la información requerida. Esta configuración predeterminada es ventajosa cuando el proveedor es una aplicación o servicio de confianza, porque elimina la necesidad de que el proveedor realice comprobaciones explícitas de identidad y de acceso al obtener información para este cliente. Sin embargo, si por cualquier motivo el proveedor de destino o la aplicación instrumentada no son de confianza, la suplantación del cliente puede constituir una amenaza para la seguridad. En tales casos, es recomendable que la aplicación cliente cambie el nivel de suplantación a un nivel inferior, como Identify. Tenga en cuenta que esto puede llevar a impedir que ciertos proveedores tengan acceso a la información, en casos en los que el proveedor no realiza comprobaciones de acceso o no tiene suficientes permisos en su propio contexto de ejecución para obtener la información requerida.

En siguiente ejemplo de código se establece una conexión con un equipo remoto y se muestra información acerca del sistema operativo del equipo remoto. El código también crea un formulario con el fin de recopilar la información de nombre de usuario y contraseña para la conexión.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Management;

namespace WMISample
{
    public class MyQuerySample : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label userNameLabel;
        private System.Windows.Forms.TextBox userNameBox;
        private System.Windows.Forms.TextBox passwordBox;
        private System.Windows.Forms.Label passwordLabel;
        private System.Windows.Forms.Button OKButton;
        private System.Windows.Forms.Button cancelButton;
        
        private System.ComponentModel.Container components = null;

        public MyQuerySample()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        private void InitializeComponent()
        {
            this.userNameLabel = new System.Windows.Forms.Label();
            this.userNameBox = new System.Windows.Forms.TextBox();
            this.passwordBox = new System.Windows.Forms.TextBox();
            this.passwordLabel = new System.Windows.Forms.Label();
            this.OKButton = new System.Windows.Forms.Button();
            this.cancelButton = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // userNameLabel
            // 
            this.userNameLabel.Location = new System.Drawing.Point(16, 8);
            this.userNameLabel.Name = "userNameLabel";
            this.userNameLabel.Size = new System.Drawing.Size(160, 32);
            this.userNameLabel.TabIndex = 0;
            this.userNameLabel.Text = 
                "Enter the user name for the remote computer:";
            // 
            // userNameBox
            // 
            this.userNameBox.Location = new System.Drawing.Point(160, 16);
            this.userNameBox.Name = "userNameBox";
            this.userNameBox.Size = new System.Drawing.Size(192, 20);
            this.userNameBox.TabIndex = 1;
            this.userNameBox.Text = "";
            // 
            // passwordBox
            // 
            this.passwordBox.Location = new System.Drawing.Point(160, 48);
            this.passwordBox.Name = "passwordBox";
            this.passwordBox.PasswordChar = '*';
            this.passwordBox.Size = new System.Drawing.Size(192, 20);
            this.passwordBox.TabIndex = 3;
            this.passwordBox.Text = "";
            // 
            // passwordLabel
            // 
            this.passwordLabel.Location = new System.Drawing.Point(16, 48);
            this.passwordLabel.Name = "passwordLabel";
            this.passwordLabel.Size = new System.Drawing.Size(160, 32);
            this.passwordLabel.TabIndex = 2;
            this.passwordLabel.Text = 
                "Enter the password for the remote computer:";
            // 
            // OKButton
            // 
            this.OKButton.Location = new System.Drawing.Point(40, 88);
            this.OKButton.Name = "OKButton";
            this.OKButton.Size = new System.Drawing.Size(128, 23);
            this.OKButton.TabIndex = 4;
            this.OKButton.Text = "OK";
            this.OKButton.Click += 
                new System.EventHandler(this.OKButton_Click);
            // 
            // cancelButton
            // 
            this.cancelButton.DialogResult = 
                System.Windows.Forms.DialogResult.Cancel;
            this.cancelButton.Location = new System.Drawing.Point(200, 88);
            this.cancelButton.Name = "cancelButton";
            this.cancelButton.Size = new System.Drawing.Size(128, 23);
            this.cancelButton.TabIndex = 5;
            this.cancelButton.Text = "Cancel";
            this.cancelButton.Click += 
                new System.EventHandler(this.cancelButton_Click);
            // 
            // MyQuerySample
            // 
            this.AcceptButton = this.OKButton;
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.CancelButton = this.cancelButton;
            this.ClientSize = new System.Drawing.Size(368, 130);
            this.ControlBox = false;
            this.Controls.Add(this.cancelButton);
            this.Controls.Add(this.OKButton);
            this.Controls.Add(this.passwordBox);
            this.Controls.Add(this.passwordLabel);
            this.Controls.Add(this.userNameBox);
            this.Controls.Add(this.userNameLabel);
            this.Name = "MyQuerySample";
            this.StartPosition = 
                System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Remote Connection";
            this.ResumeLayout(false);

        }

        [STAThread]
        static void Main() 
        {
            Application.Run(new MyQuerySample());
        }

        private void OKButton_Click(object sender, System.EventArgs e)
        {
            try
            {
                ConnectionOptions connection = new ConnectionOptions();
                connection.Username = userNameBox.Text;
                connection.Password = passwordBox.Text;
                connection.Authority = "ntlmdomain:DOMAIN";

                ManagementScope scope = new ManagementScope(
                    "\\\\FullComputerName\\root\\CIMV2", connection);
                scope.Connect();

                ObjectQuery query= new ObjectQuery(
                    "SELECT * FROM Win32_Service"); 

                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher(scope, query);

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_Service instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Caption: {0}", queryObj["Caption"]);
                    Console.WriteLine("Description: {0}", queryObj["Description"]);
                    Console.WriteLine("Name: {0}", queryObj["Name"]);
                    Console.WriteLine("PathName: {0}", queryObj["PathName"]);
                    Console.WriteLine("State: {0}", queryObj["State"]);
                    Console.WriteLine("Status: {0}", queryObj["Status"]);
                }
                Close();
            }
            catch(ManagementException err)
            {
                MessageBox.Show("An error occured while querying for WMI data: "
                    + err.Message);
            }
            catch(System.UnauthorizedAccessException unauthorizedErr)
            {
                MessageBox.Show("Connection error " + 
                    "(user name or password might be incorrect): " +
                    unauthorizedErr.Message);
            }
        }

        private void cancelButton_Click(object sender, System.EventArgs e)
        {
            Close();
        }
    }
}

Para obtener más información sobre los niveles de suplantación y autenticación utilizados por WMI en la conexión remota, vea la sección Comentarios en el ejemplo de código anterior.

Compilar el código

Para este ejemplo se requieren referencias a los espacios de nombres System y System.Management.

Vea también

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft