2010-07-08 18 views
9

Bir WQL sorgusu aracılığıyla önyükleme sabit diskinin seri numarasını almak istiyorum. WMI Sorgusu'na (WQL) katılma

önyükleme bölümü

şu sorguyu kullanarak alınabilir:

SELECT * FROM Win32_DiskPartition where BootPartition=True 

seri numarası Win32_DiskDrive içinde:

SELECT DeviceID, SerialNumber FROM Win32_DiskDrive 

Win32_DiskDriveToDiskPartitionWin32_DiskPartition için Win32_DiskDrive kartografyasını sahiptir. Onlar iç Win32_DiskPartition ve Win32_DiskDrive katılır bir WQL sorgusu inşa edebilirsiniz nasıl

Win32_DiskDriveToDiskPartition yılında Win32_DiskPartition.DeviceID için Win32_DiskDrive.DeviceID eşlenir ? Associators kullanmalı mıyım yoksa INNER JOIN ile mi çalışıyor?

cevap

13

WQL, JOIN maddesini desteklemiyor. Tahmin ettiğiniz gibi ASSOCIATORS OF ifadesini kullanmanız gerekir. İşte VBScript'teki bir örnek: Ancak

strComputer = "." 
Set oWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 

Set colPartitions = oWMI.ExecQuery(_ 
    "SELECT * FROM Win32_DiskPartition WHERE BootPartition=True") 

For Each oPartition in colPartitions 

    Set colDrives = oWMI.ExecQuery(_ 
     "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _ 
     & oPartition.DeviceID & "'} WHERE ResultClass=Win32_DiskDrive") 

    For Each oDrive in colDrives 
     WScript.Echo oDrive.SerialNumber 
    Next 

Next 

Not, Win32_DiskDrive.SerialNumber mülkiyet Windows Vista öncesindeki mevcut olmadığını. Bu nedenle, kodunuzun daha önceki Windows sürümlerinde de çalışmasını istiyorsanız (ör. Windows XP veya Windows 2000), WMI dışındaki API'leri kullanmayı düşünmelisiniz.


Düzenleme:(Cevap yorum yapmak) Evet, Win32_DiskDrive durumlarda karşılık gelen Win32_PhysicalMedia örneklerini almak için iç içe geçmiş bir ASSOCIATORS OF sorgu ekleyebilir; Böyle bir şey: - Ben PowerShell tahmin veya C# her şey daha zarif yapılabilir, ancak VBScript oldukça ayrıntılı olup

... 
For Each oDrive in colDrives 
    Set colMedia = oWMI.ExecQuery(_ 
     "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _ 
     & oDrive.DeviceID & "'} WHERE ResultClass=Win32_PhysicalMedia") 

    For Each oMedia in colMedia 
     WScript.Echo oMedia.SerialNumber 
    Next 
Next 

Sen Kullandığınız dili demedik.

+0

Çok teşekkür ederim! Win32_PhysicalMedia, bildiğim kadarıyla Windows Vista'dan önce kullanılabilir. Windows XP ile uyumluluğu sağlamak için bu üç WMI nesnesini yardımcı programlarla "birleştirmek" zorunda mıyım? – j00hi

+0

Bana gerçekten çok yardımcı oldunuz! Teşekkürler! C++ 'da yazmam gerekiyordu, ancak aynı şey aynı. C++ kodumu göndereceğim, belki birisi için yararlı olabilir. – j00hi

9

Burada, Helen tarafından yayınlanan VBScript koduyla aynı şeyi yapan C++ kodu var.

// Obtain the initial locator to WMI 
// ... 
// Connect to WMI through the IWbemLocator::ConnectServer method 
// ... 
// Set security levels on the proxy 
// ... 

wchar_t wmihddsn[256]; 
    *wmihddsn=0; 

hres = pSvc->ExecQuery(
    bstr_t("WQL"), 
    bstr_t("SELECT * FROM Win32_DiskPartition WHERE BootPartition=True"), 
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
    NULL, 
    &pEnumerator); 

if(SUCCEEDED(hres) && pEnumerator) 
{ 
    // get the first Win32_DiskPartition 
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 

    if(SUCCEEDED(hr) && 0 != uReturn) 
    { 
     VARIANT vtProp; 
     wchar_t tmp[1024]; 
     char query[1024]; 

     // Get the value of the partition's DeviceID property 
     hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0); 
     if(SUCCEEDED(hr)) 
     { 
      if(vtProp.vt == VT_BSTR) { 
       // wcout << " SerialNumber : " << vtProp.bstrVal << endl; 
       wcscpy(tmp, vtProp.bstrVal); 
      } 
      VariantClear(&vtProp); 


      // "join" Win32_DiskPartition to Win32_DiskDrive 
      sprintf(query, 
       "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='%s'} WHERE ResultClass=Win32_DiskDrive", 
       NarrowWcharString(tmp)); 

      hres = pSvc->ExecQuery(
       bstr_t("WQL"), 
       bstr_t(query), 
       WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
       NULL, 
       &pEnumerator1); 

      if(SUCCEEDED(hres) && pEnumerator1) 
      { 
       // get the first Win32_DiskDrive 
       hr = pEnumerator1->Next(WBEM_INFINITE, 1, &pclsObj1, &uReturn); 

       if(SUCCEEDED(hr) && 0 != uReturn) 
       { 
        // Get the value of the disk-drive's DeviceID 
        hr = pclsObj1->Get(L"DeviceID", 0, &vtProp, 0, 0); 
        if(SUCCEEDED(hr)) 
        { 
         if(vtProp.vt == VT_BSTR) 
         { 
          wcscpy(tmp, vtProp.bstrVal); 
         } 
         VariantClear(&vtProp); 


         // "join" Win32_DiskDrive to Win32_PhysicalMedia 
         sprintf(query, 
          "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='%s'} WHERE ResultClass=Win32_PhysicalMedia", 
          NarrowWcharString(tmp)); 

         hres = pSvc->ExecQuery(
          bstr_t("WQL"), 
          bstr_t(query), 
          WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
          NULL, 
          &pEnumerator2); 

         if(SUCCEEDED(hres) && pEnumerator2) 
         { 
          // get the first Win32_PhysicalMedia 
          hr = pEnumerator2->Next(WBEM_INFINITE, 1, &pclsObj2, &uReturn); 

          if(SUCCEEDED(hr) && 0 != uReturn) 
          { 
           // get the PhysicalMedia's SerialNumber 
           hr = pclsObj2->Get(L"SerialNumber", 0, &vtProp, 0, 0); 
           if(SUCCEEDED(hr)) 
           { 
            if(vtProp.vt == VT_BSTR) 
            { 
             // wcout << " SerialNumber : " << vtProp.bstrVal << endl; 
             wcscpy(wmihddsn,vtProp.bstrVal); 
            } 
            VariantClear(&vtProp); 
           } 

          } 

          if(pclsObj2) pclsObj2->Release(); 
         } 
         if(pEnumerator2) pEnumerator2->Release(); 

        } // get disk-drive's DeviceID 
       } 

       if(pclsObj1) pclsObj1->Release(); 
      } 
      if(pEnumerator1) pEnumerator1->Release(); 

     } // get partition's DeviceID 
    } 

    if(pclsObj) pclsObj->Release(); 
} // if succeeded first query 
if(pEnumerator) pEnumerator->Release(); 

// ... 
// cleanup 
+0

Harika olan şey, bu kodun en az Windows XP'ye uygun olmasıdır. Bu kodu Win7 64bit, Win7 32bit ve WinXP'de başarıyla test ettim. – j00hi