Herstellen einer Remoteverbindung mit WMI mit C#
Wie bei anderen Sprachen wie PowerShell, VBScript oder C++ können Sie C# verwenden, um die Hardware und Software auf Remotecomputern remote zu überwachen. Remoteverbindungen für verwalteten Code werden über den Namespace Microsoft.Management.Infrastructure hergestellt. (In früheren Versionen von WMI wurde der Namespace System.Management verwendet, der aus Gründen der Vollständigkeit hier enthalten ist.)
Hinweis
System.Management war der ursprüngliche .NET-Namespace, der für den Zugriff auf WMI verwendet wurde. Die APIs in diesem Namespace sind jedoch im Allgemeinen langsamer und skalieren im Vergleich zu ihren moderneren Microsoft.Management.Infrastructure-Entsprechungen nicht so gut.
Eine Remoteverbindung mithilfe von Klassen im Namespace Microsoft.Management.Infrastructure verwendet DCOM als zugrunde liegenden Remotemechanismus. WMI-Remoteverbindungen müssen den DCOM-Sicherheitsanforderungen für Identitätswechsel und Authentifizierung entsprechen. Standardmäßig ist ein Bereich an den lokalen Computer und an den Systemnamespace "Root\CIMv2" gebunden. Sie können jedoch sowohl den Computer, die Domäne als auch den WMI-Namespace ändern, auf den Sie zugreifen. Sie können auch Autorität, Identitätswechsel, Anmeldeinformationen und andere Verbindungsoptionen festlegen.
So stellen Sie eine Remoteverbindung mit WMI mit C# (Microsoft.Management.Infrastructure) her
Erstellen Sie eine Sitzung auf dem Remotecomputer mit einem Aufruf von CimSession.Create.
Wenn Sie eine Verbindung mit einem Remotecomputer mit den gleichen Anmeldeinformationen (Domäne und Benutzername) herstellen, mit denen Sie angemeldet sind, können Sie den Namen des Computers im Aufruf Erstellen angeben. Sobald Sie über das zurückgegebene Objekt CimSession verfügen, können Sie Ihre WMI-Abfrage durchführen.
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string OSQuery = "SELECT * FROM Win32_OperatingSystem"; CimSession mySession = CimSession.Create("Computer_B"); IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", OSQuery);
Weitere Informationen zum Erstellen von WMI-Abfragen mit der API Microsoft.Management.Infrastructure in C# finden Sie unter Abrufen von WMI-Klassen- oder Instanzdaten.
Wenn Sie verschiedene Optionen für Ihre Verbindung festlegen möchten, z. B. unterschiedliche Anmeldeinformationen, Gebietsschema- oder Identitätswechselebenen, müssen Sie in Ihrem Aufruf von CimSession.Create ein Objekt CimSessionOptions verwenden.
CimSessionOptions ist eine Basisklasse für WSManSessionOptions und DComSessionOptions. Sie können beide verwenden, um die Optionen für Ihre WS-Man- bzw. DCOM-Sitzungen festzulegen. Im folgenden Codebeispiel wird beschrieben, wie Sie ein Objekt DComSessionOptions verwenden, um die Identitätswechselebene auf Impersonate festzulegen.
string computer = "Computer_B" DComSessionOptions DComOptions = new DComSessionOptions(); DComOptions.Impersonation = ImpersonationType.Impersonate; CimSession Session = CimSession.Create(computer, DComOptions);
Wenn Sie die Anmeldeinformationen für Ihre Verbindung festlegen möchten, müssen Sie ein Objekt CimCredentials erstellen und Ihren CimSessionOptions hinzufügen.
Das folgende Codebeispiel beschreibt das Erstellen einer Klasse WSManSessionOptions, das Füllen mit den richtigen CimSessionOptions und die Verwendung in einem Aufruf CimSession.Create.
string computer = “Computer_B”; string domain = “Domain1″; string username = “User1″; string plaintextpassword; //Retrieve password from the user. //For the complete code, see the sample at the bottom of this topic. CimCredential Credentials = new CimCredential(PasswordAuthenticationMechanism.Default, domain, username, securepassword); WSManSessionOptions SessionOptions = new WSManSessionOptions(); SessionOptions.AddDestinationCredentials(Credentials); CimSession Session = CimSession.Create(computer, SessionOptions);
Es wird allgemein empfohlen, dass Sie ein Kennwort nicht in Ihre Anwendungen hartcodieren. Versuchen Sie, wie im obigen Codebeispiel gezeigt, wann immer möglich, Ihren Benutzer nach dem Kennwort abzufragen und es sicher zu speichern.
WMI dient der Überwachung von Hardware und Software auf Remotecomputern. Remoteverbindungen für WMI v1 werden über das Objekt ManagementScope ausgeführt.
So stellen Sie eine Remoteverbindung mit WMI mit C# (System.Management) her
Erstellen Sie ein Objekt ManagementScope unter Verwendung des Namens des Computers und des WMI-Pfads, und stellen Sie eine Verbindung mit Ihrem Ziel her, indem Sie ManagementScope.Connect() aufrufen.
Wenn Sie eine Verbindung mit einem Remotecomputer mit den gleichen Anmeldeinformationen (Domäne und Benutzername) herstellen, mit denen Sie angemeldet sind, müssen Sie nur den WMI-Pfad angeben. Sobald Sie eine Verbindung hergestellt haben, können Sie Ihre WMI-Abfrage erstellen.
using System.Management; ... ManagementScope scope = new ManagementScope("\\\\Computer_B\\root\\cimv2"); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
Weitere Informationen zum Erstellen von WMI-Abfragen mit der API System.Management in C# finden Sie unter Abrufen von WMI-Klassen- oder Instanzdaten.
Wenn Sie eine Verbindung mit einem Remotecomputer in einer anderen Domäne herstellen oder einen anderen Benutzernamen und ein anderes Kennwort verwenden, müssen Sie im Aufruf von ManagementScope ein Objekt ConnectionOptions verwenden.
ConnectionOptions enthält Eigenschaften zum Beschreiben der Optionen Authentifizierung, Identitätswechsel, Benutzername, Kennwort und andere Verbindungsoptionen. Im folgenden Codebeispiel wird beschrieben, wie Sie ein Objekt ConnectionOptions verwenden, um die Identitätswechselebene auf Impersonate festzulegen.
ConnectionOptions options = new ConnectionOptions(); options.Impersonation = System.Management.ImpersonationLevel.Impersonate; ManagementScope scope = new ManagementScope("\\\\FullComputerName\\root\\cimv2", options); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope,query);
Im Allgemeinen wird empfohlen, dass Sie Die Identitätswechselebene auf Identitätswechsel festlegen, sofern nicht explizit etwas anderes erforderlich ist. Versuchen Sie außerdem, ihren Namen und Ihr Kennwort in C#-Code zu schreiben. (Überprüfen Sie nach Möglichkeit, ob Sie den Benutzer abfragen können, um sie zur Laufzeit dynamisch bereitzustellen.)
Weitere Beispiele zum Festlegen unterschiedlicher Eigenschaften für eine WMI-Remoteverbindung finden Sie im Abschnitt Beispiele der Referenzseite ConnectionOptions.
Microsoft.Management.Infrastructure Example
Im folgenden C#-Codebeispiel, das auf dem folgenden Blogbeitrag auf TechNet basiert, wird beschrieben, wie Sie CimCredentials und WSManSessionOptions verwenden, um Anmeldeinformationen für eine Remoteverbindung festzulegen.
using System;
using System.Text;
using System.Threading;
using Microsoft.Management.Infrastructure;
using Microsoft.Management.Infrastructure.Options;
using System.Security;
namespace SMAPIQuery
{
class Program
{
static void Main(string[] args)
{
string computer = "Computer_B";
string domain = "DOMAIN";
string username = "AdminUserName";
string plaintextpassword;
Console.WriteLine("Enter password:");
plaintextpassword = Console.ReadLine();
SecureString securepassword = new SecureString();
foreach (char c in plaintextpassword)
{
securepassword.AppendChar(c);
}
// create Credentials
CimCredential Credentials = new CimCredential(PasswordAuthenticationMechanism.Default,
domain,
username,
securepassword);
// create SessionOptions using Credentials
WSManSessionOptions SessionOptions = new WSManSessionOptions();
SessionOptions.AddDestinationCredentials(Credentials);
// create Session using computer, SessionOptions
CimSession Session = CimSession.Create(computer, SessionOptions);
var allVolumes = Session.QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_Volume");
var allPDisks = Session.QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_DiskDrive");
// Loop through all volumes
foreach (CimInstance oneVolume in allVolumes)
{
// Show volume information
if (oneVolume.CimInstanceProperties["DriveLetter"].ToString()[0] > ' ' )
{
Console.WriteLine("Volume ‘{0}’ has {1} bytes total, {2} bytes available",
oneVolume.CimInstanceProperties["DriveLetter"],
oneVolume.CimInstanceProperties["Size"],
oneVolume.CimInstanceProperties["SizeRemaining"]);
}
}
// Loop through all physical disks
foreach (CimInstance onePDisk in allPDisks)
{
// Show physical disk information
Console.WriteLine("Disk {0} is model {1}, serial number {2}",
onePDisk.CimInstanceProperties["DeviceId"],
onePDisk.CimInstanceProperties["Model"].ToString().TrimEnd(),
onePDisk.CimInstanceProperties["SerialNumber"]);
}
Console.ReadLine();
}
}
}
System.Management Example
Im folgenden C#-Codebeispiel wird eine allgemeine Remoteverbindung mithilfe der System.Management-Objekte beschrieben.
using System;
using System.Management;
public class RemoteConnect
{
public static void Main()
{
ConnectionOptions options = new ConnectionOptions();
options.Impersonation = System.Management.ImpersonationLevel.Impersonate;
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"]);
}
}
}
Zugehörige Themen