Aracılığıyla paylaş


WMI Numaralandırma

Numaralandırma, bir nesne kümesinde hareket etme ve büyük olasılıkla her nesneyi yaptığınız gibi değiştirme eylemidir. Örneğin, belirli bir seri numarasını bulmak için bir dizi Win32_DiskDrive nesnesini numaralandırabilirsiniz. Herhangi bir nesneyi numaralandırabilmenize rağmen, WMI'nin yalnızca güvenlik erişiminiz olan nesneleri döndürdüğünü unutmayın.

Büyük veri kümelerinin numaralandırmaları büyük miktarda kaynak gerektirebilir ve performansı düşürebilir. Daha fazla bilgi için bkz. Numaralandırma Performansını İyileştirme. Ayrıca daha belirli bir sorguyla veri isteyebilirsiniz. Daha fazla bilgi için bkz. WMI Sorgulama.

Bu konuda aşağıdaki bölümler ele alınmıştır:

PowerShell Kullanarak WMI Numaralandırma

Belirli bir örneğin nesne yolunu bilmiyorsanız veya belirli bir sınıfın tüm örneklerini almak istiyorsanız, -class parametresindeki sınıfın adıyla Get-WmiObject kullanın. Sorgu kullanmak istiyorsanız -query parametresini kullanabilirsiniz.

Aşağıdaki yordamda, PowerShell kullanarak bir sınıfın örneklerinin nasıl numaralandırıldığı açıklanmaktadır.

PowerShell kullanarak bir sınıfın örneklerini listelemek için

  1. Get-WmiObject cmdlet'ine çağrısıyla örnekleri numaralandırın.

    Get-WmiObject , numaralandırabileceğiniz bir veya daha fazla WMI nesnesi koleksiyonu döndürür. Daha fazla bilgi için bkz. Koleksiyona Erişme.

    Wmi sınıfı örneğini başka bir ad alanında veya farklı bir bilgisayarda almak istiyorsanız, bilgisayar ve ad alanını sırasıyla -computer ve -namespace parametrelerinde belirtin. Daha fazla bilgi için bkz. WMI Betiği Oluşturma. Bu yalnızca uygun erişim ayrıcalıklarına sahipseniz çalışır. Daha fazla bilgi için bkz. WMI Güvenliğini Koruma ve Yetkili İşlemleri Yürütme.

  2. Koleksiyonun üyelerini kullanarak istediğiniz tek tek örnekleri alın.

Aşağıdaki kod örneği bir PowerShell koleksiyonu alır ve yerel bilgisayardaki tüm mantıksal sürücü örnekleri için boyut özelliğini görüntüler.

$objCol = get-wmiobject -class "Win32_LogicalDisk"

# Or, alternately
#$objCol = get-wmiobject -Query "SELECT * FROM Win32_LogicalDisk"

foreach ($Drive in $objCol)
{
    if ($Drive.size -ne $null)
    { "Drive " + $Drive.deviceID + " contains " + $Drive.size + " bytes" }
    else
    { "Drive " + $Drive.deviceID + " is not available." }
}

C# Kullanarak WMI Numaralandırma (Microsoft.Management.Infrastructure)

  1. Microsoft.Management.Infrastructure referans derlemesine bir referans ekleyin. (Bu derleme, Windows 8 içinWindows Yazılım Geliştirme Seti'nin (SDK) bir parçası olarak gönderilir.)
  2. Microsoft.Management.Infrastructure ad alanı için deyimini kullanarak bir ekleyin.
    using Microsoft.Management.Infrastructure;
  1. CimSession nesnesinin bir örneğini oluşturun. Aşağıdaki kod parçacığı, CimSession.Create yöntemi için standart "localhost" değerini kullanır.
    CimSession cimSession = CimSession.Create("localhost");
  1. Kullanmak istediğiniz CIM ad alanını ve WQL'yi geçirerek cimSession.QueryInstancesyönteminiçağırın. Aşağıdaki kod parçacığı, handle özelliğinin (işlem kimliğini veya PID'yi temsil eden) 0 veya 4 değerine sahip olduğu iki standart Windows işlemini temsil eden iki örnek döndürür.
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. Döndürülen CimInstance nesneleri arasında döngü yapın.
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

Aşağıdaki kod örneği, yerel makinedeki Win32_Process sınıfının (etkin işlemleri temsil eden) tüm örneklerini numaralandırır ve her işlemin adını yazdırır.

Not

Gerçek bir uygulamada bilgisayar adını ("localhost") ve CIM ad alanını ("root\cimv2") parametre olarak tanımlarsınız. Basitlik amacıyla, bunlar bu örnekte sabit kodlanmıştır.

 

using System;
using System.Collections.Generic;
using Microsoft.Management.Infrastructure;

public partial class MI
{
    static void PrintCimInstance(CimInstance cimInstance)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("{0} properties", cimInstance.CimSystemProperties.ClassName);
        Console.ResetColor();

        Console.WriteLine(String.Format("{0,-5}{1,-30}{2,-15}{3,-10}", 
                                        "Key?", "Property", "Type", "Value"));

        foreach (var enumeratedProperty in cimInstance.CimInstanceProperties)
        {
            bool isKey = ((enumeratedProperty.Flags & CimFlags.Key) == CimFlags.Key);

            if (enumeratedProperty.Value != null)
            {
                Console.WriteLine(
                    "{0,-5}{1,-30}{2,-15}{3,-10}",
                    isKey == true ? "Y" : string.Empty,
                    enumeratedProperty.Name,
                    enumeratedProperty.CimType,
                    enumeratedProperty.Value);
            }
        }
        Console.WriteLine();
    }

    public static void QueryInstance(string query)
    {
        try
        {
            CimSession cimSession = CimSession.Create("localhost");

            IEnumerable<CimInstance> queryInstances = 
              cimSession.QueryInstances(@"root\cimv2", "WQL", query);
            foreach (CimInstance cimInstance in queryInstances)
            {
                //Use the current instance. This example prints the instance. 
                PrintCimInstance(cimInstance);
            }
        }
         catch (CimException ex) 
        { 
            // Handle the exception as appropriate.
            // This example prints the message.
            Console.WriteLine(ex.Message); 
        }
    }
}

using System;

namespace MIClientManaged
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write(&quot;Enter WQL (x = Quit): &quot;);
                string query = Console.ReadLine().ToUpper();
                if (query.CompareTo(&quot;X&quot;) == 0) break;
                MI.QueryInstance(query);
            }
        }
    }
}

C# Kullanarak WMI Numaralandırma (System.Management)

Belirli bir örneğin nesne yolunu bilmiyorsanız veya belirli bir sınıfın tüm örneklerini almak istiyorsanız, WMI ad alanında belirli bir sınıfın tüm örneklerini içeren bir ManagementObjectCollection almak için ManagementClass nesnesini kullanın. Alternatif olarak, aynı nesne kümesini elde etmek için ManagementObjectSearcher aracılığıyla WMI'yi sorgulayabilirsiniz.

Başlık

System.Management WMI'ye erişmek için kullanılan özgün .NET ad alanıydı; ancak, bu ad alanındaki API'ler genellikle daha yavaştır ve daha modern Microsoft.Management.Infrastructure karşılıklarına göre ölçeklendirilmemektedir.

 

Aşağıdaki yordamda, C# kullanarak bir sınıfın örneklerinin nasıl numaralandırıldığı açıklanmaktadır.

C# kullanarak bir sınıfın örneklerini listelemek için

  1. ManagementClass.GetInstancesçağrısıyla örnekleri numaralandırın.

    getInstances yöntemi, numaralandırabileceğiniz nesnelerin koleksiyonunu veya kümesini döndürür. Daha fazla bilgi için bkz. Koleksiyona Erişme. Döndürülen koleksiyon aslında bir ManagementObjectCollection nesnesidir, bu nedenle bu nesnenin yöntemlerinden herhangi biri çağrılabilir.

    Wmi sınıf örneğini başka bir ad alanında veya farklı bir bilgisayarda almak istiyorsanız, yolu parametresinde bilgisayarı ve ad alanını belirtin. Daha fazla bilgi için WMI Betiği Oluşturmabölümüne bakın. Bu yalnızca uygun erişim ayrıcalıklarına sahipseniz çalışır. Daha fazla bilgi için bkz. WMI Güvenliğini Koruma ve Ayrıcalıklı İşlemleri Yürütme.

  2. Koleksiyonun üyelerini kullanarak istediğiniz tek tek örnekleri alın.

Aşağıdaki kod örneği bir C# koleksiyonu alır ve yerel bilgisayardaki tüm mantıksal sürücü örnekleri için boyut özelliğini görüntüler.

using System.Management;
...

ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection objCol = mc.GetInstances();

//or, alternately
//ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
//ManagementObjectCollection objCol = mgmtObjSearcher.Get();

if (objCol.Count != 0)
{
   foreach (ManagementObject Drive in objCol)
   {
      if (Drive["size"] != null)
      {
         Console.WriteLine("Drive {0} contains {1} bytes.", Drive["deviceID"], Drive["size"]);
      }
      else
      {
         Console.WriteLine("Drive {0} is not available.", Drive["deviceID"]);
      }
   }
}
Console.ReadLine();

VBScript Kullanarak WMI Numaralandırma

Belirli bir örneğin nesne yolunu bilmiyorsanız veya belirli bir sınıfın tüm örneklerini almak istiyorsanız SWbemServices.InstancesOfyöntemini kullanarak bir sınıfın tüm örneklerinin SWbemObjectSet numaralandırmasını döndürün. Alternatif olarak, aynı nesne kümesini elde etmek için WMI'yi SWbemServices.ExecQuery aracılığıyla sorgulayabilirsiniz.

Aşağıdaki yordam, VBScript kullanarak bir sınıfın örneklerinin nasıl numaralandırılacağını açıklar.

VBScript kullanarak bir sınıfın örneklerini listelemek için

  1. SWbemServices.InstancesOf yöntemine bir çağrı ile örnekleri numaralandırın.

    InstancesOf yöntemi, numaralandırabileceğiniz nesnelerin koleksiyonunu veya kümesini döndürür. Daha fazla bilgi için bkz. Koleksiyona Erişme. Döndürülen koleksiyon aslında bir SWbemObjectSet nesnesidir, bu nedenle bu nesnenin yöntemlerinden herhangi biri çağrılabilir.

    Başka bir ad alanında veya farklı bir bilgisayarda bir WMI sınıfı örneğini almak istiyorsanız, tanımlayıcıda bilgisayar ve ad alanını belirtin. Daha fazla bilgi için bkz. WMI Betiği Oluşturma. Bu yalnızca uygun erişim ayrıcalıklarına sahipseniz çalışır. Daha fazla bilgi için bkz. WMI Güvenliğini Koruma ve Ayrıcalıklı İşlemlerYürütme.

  2. Koleksiyon yöntemlerini kullanarak istediğiniz tek tek örnekleri alın.

Aşağıdaki kod örneği bir SWbemServices nesnesi alır ve ardından yerel bilgisayardaki tüm mantıksal sürücü örnekleri için boyut özelliğini görüntülemek üzere InstancesOf yöntemini yürütür.

Set objCol = GetObject("WinMgmts:").InstancesOf("Win32_LogicalDisk")
For Each Drive In objCol
    If Not IsNull(Drive.Size) Then    
       WScript.Echo ("Drive " & Drive.deviceid & " contains " & Drive.Size & " bytes")
    Else
       WScript.Echo ("Drive " & Drive.deviceid & " is not available.")
    End If
Next

C++ Kullanarak WMI Numaralandırma

Temel numaralandırma gerçekleştirmeye ek olarak, numaralandırmanızın performansını artırmak için çeşitli bayraklar ve özellikler ayarlayabilirsiniz. Daha fazla bilgi için bkz. Numaralandırma Performansını İyileştirme.

WMI'de bir nesne kümesini listelemek için

  1. Numaralandırmak istediğiniz nesne kümesini açıklayan bir IEnumWbemClassObject arabirimi oluşturun.

    IEnumWbemClassObject nesnesi, wmi nesneleri kümesini açıklayan bir liste içerir. IEnumWbemClassObject yöntemlerini kullanarak iletmeleri numaralandırabilir, nesneleri atlayabilir, başlangıçtan başlayabilir ve numaralandırıcıyı kopyalayabilirsiniz. Aşağıdaki tabloda, farklı WMI nesnesi türleri için numaralandırıcılar oluşturmak için kullanılan yöntemler listelenmiştir.

    Nesne Yöntem
    Sınıf
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    Örnek
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    Sorgu sonucu
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    Olay bildirimi
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. IEnumWbemClassObject::Nextveya IEnumWbemClassObject::NextAsyncbirden çok çağrı kullanarak döndürülen sabit listesi arasında geçiş yapma.

Daha fazla bilgi için bkz. Sınıf ve Örnek Bilgilerini Düzenleme.