Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

HDD numero Serie WMI BCB6

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: HDD numero Serie WMI BCB6 Responder citando

Hola he tenido problemas con el codigo de este tema
https://cppbuilder.es/viewtopic.php?t=7859&start=0&postdays=0&postorder=asc&highlight=numero+serie y encontre este codigo OpenSourse de Victor Chen de la pag
http://www.cppfans.com/cntfile.asp?fn=wmi_bcb
incluye libreria para bcb 6
y esta es la adaptacion no encuentro URL pagina de nuevo para postear url pero no funciona en BCB6 solo funciona en XE8 necesito

Codigo para BCB6
Cabeceras
agregar libreria de la URL anterior wbemuuid.lib
#include <wbemidl>
#include <utilcls>

Código:

__fastcall TForm1::TForm1(TComponent *Owner): TForm(Owner)
{

   CoInitializeSecurity(NULL,  - 1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);

}

//---------------------------------------------------------------------------

__fastcall TForm1::~TForm1()
{

   CoUninitialize();

}
//---------------------------------------------------------------------------
void ObtenerNumeroDeSerie(int nDriveNumber, WideString &strSerialNumber)
{
   ULONG uReturn = 0;
   HRESULT hr = E_FAIL;
   strSerialNumber = L"";
   TCHAR strDrivePath[32];
   wsprintf(strDrivePath,TEXT("\\\\.\\PHYSICALDRIVE%u"), nDriveNumber);

   TComInterface<IWbemLocator> pIWbemLocator;
   hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pIWbemLocator);
   TComInterface<IWbemServices> pIWbemServices;
   hr = pIWbemLocator->ConnectServer(L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &pIWbemServices);
   hr = ::CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

   if(FAILED(hr))
    return;

   WideString szQueryLanguage = L"WQL";
   WideString szQuery =  L"SELECT Tag, SerialNumber FROM Win32_PhysicalMedia";
   TComInterface <IEnumWbemClassObject> pEnumClassObject;
   hr = pIWbemServices->ExecQuery(szQueryLanguage.c_bstr(), szQuery.c_bstr(), WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumClassObject);

    if(FAILED(hr))
    return;

    while(pEnumClassObject)
   {
        TComInterface<IWbemClassObject> pIWbemClassObject;
        hr = pEnumClassObject->Next(WBEM_INFINITE, 1, &pIWbemClassObject, &uReturn);
        if(0 == uReturn || FAILED(hr))
        break;

        TVariant vtTag;
        TVariant vtSerialNumber;

        hr = pIWbemClassObject->Get(L"Tag", 0, &vtTag, NULL, NULL);
        WideString strTag(vtTag.bstrVal);
        if(SameText(strTag, strDrivePath))
      {
            hr = pIWbemClassObject->Get(L"SerialNumber", 0, &vtSerialNumber, NULL, NULL);
            strSerialNumber = vtSerialNumber.bstrVal;

         //Form1->Memo1->Lines->Add(/*"Tag = " +*/ strTag) ;
         FConfig->Caption = String(strSerialNumber).Trim();

            vtTag = NULL;
            vtSerialNumber = NULL;
            break;
        }

   }

}
//------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   WideString sDrv0SerialNumber = L"";
   WideString sDrv1SerialNumber = L"";
   WideString sDrv2SerialNumber = L"";
   WideString sDrv3SerialNumber = L"";

   Memo1->Lines->Clear();

   //the integer is the number of the drive you want to get serial number for

   ObtenerNumeroDeSerie(0, sDrv0SerialNumber);
   Form1->Memo1->Lines->Add("");
   ObtenerNumeroDeSerie(1, sDrv1SerialNumber);
   Form1->Memo1->Lines->Add("");

   ObtenerNumeroDeSerie(2, sDrv2SerialNumber);
   Form1->Memo1->Lines->Add("");

   ObtenerNumeroDeSerie(3, sDrv3SerialNumber);
   Form1->Memo1->Lines->Add("");
}
//---------------------------------------------------------------------------
[url][/url]
_________________
[code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1]
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

A ver si te vale así, lo he probado en el BCB6, XE4 y 10.1 (solo lo he probado en Windows 10, no sé qué tal ira en otros Windows):

(En este caso no es necesario añadir "wbemuuid.lib")

Código:

#include <utilcls.h>
#include <wbemprov.h>
#include <comobj.hpp>

String ObtenerNumeroDeSerie(int nDriveNumber)
{
   String strSerialNumber;
   String drive = Format("\\\\.\\PHYSICALDRIVE%u", ARRAYOFCONST((nDriveNumber)));

   TComInterface<IWbemLocator> locator;
   OleCheck(locator.CreateInstance(CLSID_WbemAdministrativeLocator));
   TComInterface<IWbemServices> services;
   OleCheck(locator->ConnectServer((BSTR)L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &services));
   OleCheck(CoSetProxyBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
      NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE));

   TComInterface<IEnumWbemClassObject> enumClass;
   const WideString query = L"SELECT Tag, SerialNumber FROM Win32_PhysicalMedia";
   OleCheck(services->ExecQuery((BSTR)L"WQL", query.c_bstr(),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumClass));

   while (enumClass)
   {
      ULONG uRet = 0;
      TComInterface<IWbemClassObject> classObj;
      OleCheck(enumClass->Next(WBEM_INFINITE, 1, &classObj, &uRet));
      if (!uRet) break;

      TVariant vtTag, vtSerialNumber;
      OleCheck(classObj->Get(L"Tag", 0, &vtTag, NULL, NULL));
      if (SameText(vtTag, drive))
      {
         OleCheck(classObj->Get(L"SerialNumber", 0, &vtSerialNumber, NULL, NULL));
         strSerialNumber = vtSerialNumber;
         break;
      }
   }

   return strSerialNumber.Trim();
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Espero que si yo nunca e tenido problemas con el código que dejaron en el otro hilo en mis equipos, pero las personas han que adquirido el software si y no puedo revisar directamente el problema.

Ya lo e provado en mis equipos y funciona en Windows 7 y 8.1... Saludos
_________________
[code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1]
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

vizca321 escribió:
nunca e tenido problemas con el código que dejaron en el otro hilo en mis equipos, pero las personas han que adquirido el software si

No funciona con RAID, que podría ser una de las causas de que no te funcione en algunos equipos. Fíjate si es el caso de las personas a las que no les funciona..

Aunque casualmente en varios equipos con RAID en los que probé, lo que si funciono es el número de serie de la placa base, por si te es útil, con unas ligeras modificaciones (no funciona con todas las placas base):
Código:
String ObtenerNumeroDeSeriePB()
{
    String strSerialNumber;

    TComInterface<IWbemLocator> locator;
    OleCheck(locator.CreateInstance(CLSID_WbemAdministrativeLocator));
    TComInterface<IWbemServices> services;
    OleCheck(locator->ConnectServer((BSTR)L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &services));
    OleCheck(CoSetProxyBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
        NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE));

    TComInterface<IEnumWbemClassObject> enumClass;
    const WideString query = L"SELECT SerialNumber FROM Win32_BaseBoard";
    OleCheck(services->ExecQuery((BSTR)L"WQL", query.c_bstr(),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumClass));

    ULONG uRet = 0;
    TComInterface<IWbemClassObject> classObj;
    OleCheck(enumClass->Next(WBEM_INFINITE, 1, &classObj, &uRet));
    if (uRet)
    {
        TVariant vtSerialNumber;
        OleCheck(classObj->Get(L"SerialNumber", 0, &vtSerialNumber, NULL, NULL));
        strSerialNumber = vtSerialNumber;
    }

    return strSerialNumber.Trim();
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.