Menyambungkan ke WMI Dari Jarak Jauh dengan C #

Seperti halnya bahasa lain seperti PowerShell, VBScript, atau C++, Anda dapat menggunakan C# untuk memantau perangkat keras dan perangkat lunak dari jarak jauh di komputer jarak jauh. Koneksi jarak jauh untuk kode terkelola dicapai melalui namespace Microsoft.Management.Infrastructure . (Versi WMI sebelumnya menggunakan namespace System.Management , yang disertakan di sini untuk kelengkapan.)

Catatan

System.Management adalah namespace .NET asli yang digunakan untuk mengakses WMI; namun, API di namespace ini umumnya lebih lambat dan tidak menskalakan juga relatif terhadap mitra Microsoft.Management.Infrastructure yang lebih modern.

 

Menyambungkan dari jarak jauh menggunakan kelas di namespace Microsoft.Management.Infrastructure menggunakan DCOM sebagai mekanisme jarak jauh yang mendasar. Koneksi jarak jauh WMI harus mematuhi persyaratan keamanan DCOM untuk peniruan dan autentikasi. Secara default, cakupan terikat ke komputer lokal dan namespace sistem "Root\CIMv2". Namun, Anda dapat mengubah namespace komputer, domain, dan WMI yang Anda akses. Anda juga dapat mengatur otoritas, peniruan identitas, kredensial, dan opsi koneksi lainnya.

Untuk menyambungkan ke WMI dari jarak jauh dengan C# (Microsoft.Management.Infrastructure)

  1. Buat sesi di komputer jarak jauh dengan panggilan ke CimSession.Create.

    Jika Anda menyambungkan ke komputer jarak jauh menggunakan kredensial yang sama (domain dan nama pengguna) yang Anda gunakan untuk masuk, maka Anda dapat menentukan nama komputer dalam buat panggilan. Setelah Anda memiliki objek CimSession yang dikembalikan, Anda kemudian dapat membuat kueri WMI Anda.

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

    Untuk informasi selengkapnya tentang membuat kueri WMI dengan Api Microsoft.Management.Infrastructure di C#, lihat Mengambil Kelas WMI atau Data Instans.

  2. Jika Anda ingin mengatur opsi yang berbeda untuk koneksi Anda, seperti kredensial, lokal, atau tingkat Peniruan yang berbeda, Anda perlu menggunakan objek CimSessionOptions dalam panggilan Anda ke CimSession.Create.

    CimSessionOptions adalah kelas dasar untuk WSManSessionOptions dan DComSessionOptions. Anda dapat menggunakan salah satu untuk mengatur opsi pada sesi WS-Man dan DCOM Anda. Sampel kode berikut menjelaskan menggunakan objek DComSessionOptions untuk mengatur tingkat Peniruan ke Meniru.

    string computer = "Computer_B"
    DComSessionOptions DComOptions = new DComSessionOptions();
    DComOptions.Impersonation = ImpersonationType.Impersonate;
    
    CimSession Session = CimSession.Create(computer, DComOptions);
    
  3. Jika Anda ingin mengatur kredensial untuk koneksi Anda, Anda harus membuat dan menambahkan objek CimCredentials ke CimSessionOptions Anda.

    Sampel kode berikut menjelaskan pembuatan kelas WSManSessionOptions , mengisinya dengan CimSessionOptions yang tepat, dan menggunakannya dalam panggilan 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);
    

    Umumnya disarankan agar Anda tidak melakukan hardcode kata sandi ke dalam aplikasi Anda; seperti yang ditunjukkan oleh sampel kode di atas, jika memungkinkan, coba kueri pengguna Anda untuk kata sandi, dan simpan dengan aman.

WMI dimaksudkan untuk memantau perangkat keras dan perangkat lunak di komputer jarak jauh. Koneksi jarak jauh untuk WMI v1 dicapai melalui objek ManagementScope .

Untuk menyambungkan ke WMI dari jarak jauh dengan C# (System.Management)

  1. Buat objek ManagementScope , menggunakan nama komputer dan jalur WMI, dan sambungkan ke target Anda dengan panggilan ke ManagementScope.Connect().

    Jika Anda menyambungkan ke komputer jarak jauh menggunakan kredensial yang sama (domain dan nama pengguna) yang Anda gunakan untuk masuk, maka Anda hanya perlu menentukan jalur WMI. Setelah tersambung, Anda bisa membuat kueri WMI.

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

    Untuk informasi selengkapnya tentang membuat kueri WMI dengan Api System.Management di C#, lihat Mengambil Kelas WMI atau Data Instans.

  2. Jika Anda tersambung ke komputer jarak jauh di domain lain atau menggunakan nama pengguna dan kata sandi yang berbeda, maka Anda harus menggunakan objek ConnectionOptions dalam panggilan ke ManagementScope.

    ConnectionOptions berisi properti untuk menjelaskan Autentikasi, Peniruan Identitas, nama pengguna, kata sandi, dan opsi koneksi lainnya. Sampel kode berikut menjelaskan menggunakan ConnectionOptions untuk mengatur Tingkat Peniruan Ke Peniruan Identitas.

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

    Secara umum, disarankan agar Anda mengatur tingkat Peniruan Anda ke Meniru kecuali secara eksplisit diperlukan sebaliknya. Selanjutnya, cobalah untuk menghindari penulisan nama dan kata sandi Anda ke dalam kode C#. (Jika memungkinkan, lihat apakah Anda dapat meminta pengguna untuk menyediakannya secara dinamis saat runtime.)

    Untuk contoh selengkapnya tentang mengatur properti yang berbeda pada koneksi WMI jarak jauh, lihat bagian Contoh halaman referensi ConnectionOptions .

Contoh Microsoft.Management.Infrastructure

Contoh kode C# berikut, berdasarkan posting blog berikut di TechNet, menjelaskan cara menggunakan CimCredentials dan WSManSessionOptions untuk mengatur kredensial pada koneksi jarak jauh.

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

Contoh System.Management

Sampel kode C# berikut menjelaskan koneksi jarak jauh umum, menggunakan objek System.Management.

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

Menyambungkan ke WMI pada Komputer Jarak Jauh