通过WMI获得硬盘序列号或其他信息

工程人员今天反馈,我们的程序在vista下不能获得机器码(硬盘序列号)。经过Google查找资料和MSDN的帮助终于搞定。

 

网上很多VB.NET的代码示例这里就不说了。

 

C#

 

 string info="";
   ManagementClass mc = new ManagementClass("Win32_PhysicalMedia");
   ManagementObjectCollection moc=mc.GetInstances();
   foreach(ManagementObject mo in moc)
   {
    info = mo.Properties["SerialNumber"].Value.ToString();
   }
   moc=null;
   mc=null;
   
   textBox1.Text = info;

 

注意添加:System.Management引用。在代码的前面添加using System.Management;

添加引用?不会,不可能?介绍他的方法:

在vs.net 2003(我最喜欢用的,当然我的机器不喜欢用更高的版本太慢)

Project->Add Reference-> .NET 查找->System.Management ->点击“Select”按钮->点击“ok”按钮即可。

 

C++的方法,这个方法查找的资料最少了,通过MSDN一下子搞定,都是他上面的代码。我修改一下为了获得硬盘序列号

 HRESULT hres;

    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x"
            << hex << hres << endl;
        return ;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------

    hres =  CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities
        NULL                         // Reserved
        );

                     
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return ;                    // Program has failed.
    }
   
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,            
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object."
            << " Err code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return ;                 // Program has failed.
    }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
 
    // Connect to the root/cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT//CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (e.g. Kerberos)
         0,                       // Context object
         &pSvc                    // pointer to IWbemServices proxy
         );
   
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x"
             << hex << hres << endl;
        pLoc->Release();    
        CoUninitialize();
        return ;                // Program has failed.
    }

    cout << "Connected to ROOT//CIMV2 WMI namespace" << endl;


    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities
    );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x"
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();    
        CoUninitialize();
        return ;               // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t("SELECT * FROM Win32_PhysicalMedia"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
   
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed."
            << " Error code = 0x"
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return ;               // Program has failed.
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
 
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
  
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
            &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;
        VariantInit(&vtProp);

        // Get the value of the Name property
        hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
        wcout << " OS Name : " << vtProp.bstrVal << endl;
        VariantClear(&vtProp);
    }

    // Cleanup
    // ========
   
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    pclsObj->Release();
    CoUninitialize();

 

希望大家都行动起来将自己的成果展示给大家看。多多看看 看雪论坛 到了那里才知道自己的无知。那天那个大侠自己写个操作系统,争取这个大侠早日出现!

Delphi7是一款强大的集成开发环境(IDE),其中包含了用于创建Windows应用程序的工具和组件。WMI(Windows Management Instrumentation)可以帮助开发人员在Windows操作系统中获取和管理各种系统信息。 要获取硬盘序列号,我们可以使用Delphi7提供的WMI组件。首先,我们需要在项目中导入WMI组件。 在Delphi7的主菜单中,选择"Component"->"Import ActiveX Control",然后在弹出的对话框中找到并选中"WMI Scripting Library",点击"Install"按钮进行安装。 安装完毕后,我们可以在工具栏中看到WMI组件的图标。我们可以通过拖拽该图标到窗体上,或者在代码中创建一个TWMIScriptControl组件的实例。 下面是一段示例代码,用于获取硬盘序列号: ```delphi procedure TForm1.Button1Click(Sender: TObject); var WMIService: Variant; DiskDriveItems, DiskDrive: Variant; i: Integer; SerialNumber: String; begin WMIService := CreateOleObject('WbemScripting.SWbemLocator').ConnectServer('.', 'root\CIMv2', '', '', '', '', 0, nil); DiskDriveItems := WMIService.ExecQuery('SELECT * FROM Win32_DiskDrive'); for i := 0 to DiskDriveItems.Count - 1 do begin DiskDrive := DiskDriveItems.ItemIndex[i]; SerialNumber := DiskDrive.SerialNumber; // 获取硬盘序列号 ShowMessage('硬盘' + IntToStr(i+1) + '序列号:' + SerialNumber); end; end; ``` 上述代码中,我们首先建立了一个WMIService对象,用来连接WMI服务。然后,我们执行了一个WQL查询,选择Win32_DiskDrive类中的所有项。接着,我们遍历查询结果,获取每个硬盘序列号,并显示在消息框中。 这样,我们就可以通过Delphi7的WMI组件获取硬盘序列号了。记得在运行程序时以管理员身份运行,以避免获取受限信息的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值