FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Dudas con WMI y Select * From Win32_DiskDrive
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Dudas con WMI y Select * From Win32_DiskDrive
Posted: Fri Jul 19, 2013 01:38 PM
Saludos a Todos:

Tengo la siguiente duda y a la vez error:

Necesito obtener información de un disco duro "X" que esta mapeada como "X" unidad con WMI, he intentado con:

Code (fw): Select all Collapse
#Include "FIVEWIN.CH" 

FUNCTION Main() 
   DatosHD("F:")
RETURN Nil

STATIC FUNCTION DatosHD(cDrive)
LOCAL  oDatos 
LOCAL    oLoc:= CreateObject( "wbemScripting.SwbemLocator" ) 
LOCAL    oSrv:= oLoc:ConnectServer() 
LOCAL  oDisco:= oSrv:ExecQuery("Select * From Win32_DiskDrive Where DeviceID = "+cDrive)


FOR Each oDatos in oDisco 
    MSGInfo(cValtoChar(oDisco:Model),"Nombre del Disco")
    MSGInfo(cValtoChar(oDisco:Caption),"Nombre del Disco") 
NEXT 


RETURN Nil


Pero no obtengo nada, y si modifico la linea

Code (fw): Select all Collapse
LOCAL  oDisco:= oSrv:ExecQuery("Select * From Win32_DiskDrive")


Obtengo un error:

Code (fw): Select all Collapse
Time from start: 0 hours 0 mins 0 secs 
   Error occurred at: 07/19/13, 08:34:55
   Error description: (DOS Error -2147352570) WINOLE/1009  No exported method: MODEL

Stack Calls
===========
   Called from:  => TOLEAUTO:MODEL( 0 )
   Called from: WMI.prg => DATOSHD( 15 )
   Called from: WMI.prg => MAIN( 4 )



Ando algo perdido, estoy trabajando con WMIExplorer para probar con algunas instancias pero no funcionan... Ojala alguien me de una mano.. Gracias..:-) :-) :-)
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Dudas con WMI y Select * From Win32_DiskDrive
Posted: Fri Jul 19, 2013 03:04 PM
Victor,

Para el primer caso prueba asi: (observa la comillas en rojo)

DatosHD( "'F:'" )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Dudas con WMI y Select * From Win32_DiskDrive
Posted: Fri Jul 19, 2013 03:06 PM
En el segundo, cambiastes el orden de las variables:

Code (fw): Select all Collapse
FOR Each oDatos in oDisco 
    MSGInfo(cValtoChar(oDisco:Model),"Nombre del Disco")
    MSGInfo(cValtoChar(oDisco:Caption),"Nombre del Disco") 
NEXT


debería ser:
Code (fw): Select all Collapse
FOR Each oDatos in oDisco 
    MSGInfo(cValtoChar(oDatos:Model),"Nombre del Disco")
    MSGInfo(cValtoChar(oDatos:Caption),"Nombre del Disco") 
NEXT
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Dudas con WMI y Select * From Win32_DiskDrive
Posted: Fri Jul 19, 2013 05:37 PM
Hola, cuatecatl82, aqui tienes otro ejemplo:

Code (fw): Select all Collapse
Function MyDisks()
local oLoc := CreateObject ( "wbemScripting.SwbemLocator" )
local oWMI := oLoc:ConnectServer()
local    aPCs := oWMI:ExecQuery( "Select * FROM Win32_LogicalDisk" ), oPC
local aInfo:={}

 for each oPC in aPCs
      aadd(aInfo, {oPC:Caption, oPC:Description, oPC:DeviceID, oPC:DriveType, oPC:FileSystem, oPC:FreeSpace, oPc:InstallDate, oPC:MediaType, oPc:Name, oPc:Size, oPC:Status, oPC:SystemName, oPC:VolumeName, oPC:VolumeSerialNumber, oPC:ProviderName} )
 next


XBrowse( aInfo,"DISKS ")
Return nil

Saludos.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Dudas con WMI y Select * From Win32_DiskDrive
Posted: Sat Jul 20, 2013 01:32 AM
Gracias a ambos por Responder tan pronto:

Maestro Antonio: Como siempre enseñandonos, :-) :-) :-) tenia razón estaban cambiadas las variables, madrugar y programar sin un cafecito de por medio para quitar el sueño hace mal.


Francisco: Lo habia probado pero necesitaba el nombre de Fabrica del disco duro, de hecho estoy pasando parte de tu codigo para mejorar los datos obtenidos, ya puedo tenerlos siempre y cuando sean Discos Duros, IDE, SATA, USB o RAMDISK, me falta pulirlo un poco más para las unidades de CD - DVD o Extraibles, ando en eso..

Estudiando un poco el Ejemplo de Protect.Prg de Fivewin mejore el código, lo pongo como quedo funcionando para mis necesidades:

Code (fw): Select all Collapse
#Include "FIVEWIN.CH" 

FUNCTION Main() 

LOCAL aDatos:= InfoDisco("C:")

MSGInfo(aDatos[1],"Nombre")
MSGInfo(aDatos[2],"Serial")
MSGInfo(aDatos[3],"Interface")


RETURN Nil


STATIC FUNCTION InfoDisco(cDrive)

LOCAL  oDatos 
LOCAL   aInfo:= {}
LOCAL    oLoc:= CreateObject( "wbemScripting.SwbemLocator" ) 
LOCAL    oSrv:= oLoc:ConnectServer() 
LOCAL   oJobs:= oSrv:ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition")
LOCAL cDriveNumber


FOR Each oDatos In oJobs
      IF cDrive == StrToken( oDatos:Dependent, 2, '"' )
         cDriveNumber = SUBSTR( StrToken( StrToken( oDatos:Antecedent, 2, '"' ), 1, "," ), 7 )
         AADD(aInfo ,DatosDisco(oSrv, cDriveNumber))
         AADD(aInfo ,SerieDisco(oSrv, cDriveNumber))
         AADD(aInfo ,InterDisco(oSrv, cDriveNumber))
      ENDIF
NEXT   

RETURN aInfo
   
    
STATIC FUNCTION DatosDisco(oSrv,cDriveNumber)

LOCAL  oDisco:= oSrv:ExecQuery("SELECT * FROM Win32_DiskDrive")
LOCAL cNombre:= ""
LOCAL  oDrive

FOR Each oDrive In oDisco
      IF oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber
         cNombre:= oDrive:Model
      ENDIF
NEXT
         
RETURN cNombre


STATIC FUNCTION SerieDisco(oSrv,cDriveNumber)

LOCAL  oDisco:= oSrv:ExecQuery("SELECT * FROM Win32_DiskDrive")
LOCAL cDevice:= ""
LOCAL  oDrive

FOR Each oDrive In oDisco
      IF oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber
         cDevice:= oDrive:PnPDeviceID
      ENDIF
NEXT
         
RETURN cDevice


STATIC FUNCTION InterDisco(oSrv,cDriveNumber)

LOCAL  oDisco:= oSrv:ExecQuery("SELECT * FROM Win32_DiskDrive")
LOCAL cInterf:= ""
LOCAL  oDrive

FOR Each oDrive In oDisco
      IF oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber
         cInterf:= oDrive:InterfaceType
      ENDIF
NEXT
         
RETURN cInterf


Lo mejoro y actualizo en cuanto haga más pruebas.. Gracias.. :-) :-) :-) :-) :-) :-)
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Dudas con WMI y Select * From Win32_DiskDrive
Posted: Sat Jul 20, 2013 03:25 AM

Victor,
Gracias por compartir tu código.
Saludos.

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Dudas con WMI y Select * From Win32_DiskDrive
Posted: Sat Jul 20, 2013 06:10 PM
He mejorado el código para poder tener acceso a todo tipo de Discos, desde los de 1.44 Mb hasta los de 5 Tb, sean discos de 3 1/2, Discos Duros Sata, IDE, USB, CD-RW, DVD-RW externos e Internos, Memorias USB de cualquier tipo y tamaño... Hay mucha informacíon que se puede obtener siempre y cuando sea una Unidad de Disco Válida, caso contrario mostrara un mensaje finalizando de forma correcta el ejemplo...

Lo dejo a consideración de quien lo necesite, es solo un prototipo para el proyecto VirtualDisk que tengo en mente, los valores que se pueden obtener son variados y para lo que necesito me basta, si alguien quiere agregar o modificar y actualizarla es este post será bienvenido, la idea es aprender y explotar lo que se puede hacer con WMI..

Saludos..

Code (fw): Select all Collapse
#Include "FIVEWIN.CH" 

FUNCTION Main() 

LOCAL aDatos:= InfoDisco("C:")

IF VALTYPE(aDatos) == "A"

   MSGInfo(aDatos[1],"Tipo de Disco")
   MSGInfo(aDatos[2],"Nombre del Disco")
   MSGInfo(aDatos[3],"Serial del Disco")
   MSGInfo(aDatos[4],"Interface")

ELSE

   MSGStop(" No se ha podido Obtener Datos desde la Unidad",aDatos)

ENDIF


RETURN Nil




//---------------------------------------------------------------------------------------//
STATIC FUNCTION InfoDisco(cDrive)

LOCAL  oDatos
LOCAL   aInfo:= {}
LOCAL    oLoc:= RevisaWMI()
LOCAL    oSrv:= oLoc:ConnectServer() 
LOCAL   oJobs:= oSrv:ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition")
LOCAL   oTDsk:= oSrv:ExecQuery("SELECT * FROM Win32_LogicalDisk Where DeviceID = '"+cDrive+"'")
LOCAL   oCDVD:= oSrv:ExecQuery("SELECT * FROM Win32_CDROMDrive")
LOCAL   oFlop:= oSrv:ExecQuery("SELECT * FROM Win32_FloppyDrive")
LOCAL lExiste:= IsDrive (cDrive)
LOCAL cDriveNumber
LOCAL cDriveNombre


IF lExiste == .T.

IF VALTYPE(oLoc) == "O"


FOR Each oDatos In oTDsk
    cDriveNombre:= OEMtoANSI(oDatos:Description)
    AADD(aInfo , cDriveNombre)
NEXT

     IF cDriveNombre == "Unidad de disco de 3 1/2 pulgadas"
        FOR Each oDatos In oFlop
            AADD(aInfo , oDatos:Caption)
            AADD(aInfo , oDatos:PnPDeviceID)
            AADD(aInfo , OEMtoANSI(oDatos:Manufacturer))
        NEXT
       
 ELSEIF cDriveNombre == "Disco CD-ROM"
        FOR Each oDatos In oCDVD
            AADD(aInfo , oDatos:Caption)
            AADD(aInfo , oDatos:PnPDeviceID)
            AADD(aInfo , oDatos:MediaType)
        NEXT
   ELSE 

        FOR Each oDatos In oJobs
            IF cDrive == StrToken( oDatos:Dependent, 2, '"' )
               cDriveNumber = SUBSTR( StrToken( StrToken( oDatos:Antecedent, 2, '"' ), 1, "," ), 7 )
               AADD(aInfo , DatosDisco(oSrv, cDriveNumber))
               AADD(aInfo , SerieDisco(oSrv, cDriveNumber))
               AADD(aInfo , InterDisco(oSrv, cDriveNumber))
         ENDIF
       NEXT   

ENDIF

ENDIF

ELSE
    RETURN "Disco "+ cDrive + "\  No Accesible."
ENDIF

RETURN aInfo
   
    


//---------------------------------------------------------------------------------------//
STATIC FUNCTION DatosDisco(oSrv,cDriveNumber)

LOCAL  oDisco:= oSrv:ExecQuery("SELECT * FROM Win32_DiskDrive")
LOCAL cNombre:= ""
LOCAL  oDrive

FOR Each oDrive In oDisco
      IF oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber
         cNombre:= oDrive:Model
      ENDIF
NEXT
         
RETURN cNombre




//---------------------------------------------------------------------------------------//
STATIC FUNCTION SerieDisco(oSrv,cDriveNumber)

LOCAL  oDisco:= oSrv:ExecQuery("SELECT * FROM Win32_DiskDrive")
LOCAL cDevice:= ""
LOCAL  oDrive

FOR Each oDrive In oDisco
      IF oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber
         cDevice:= oDrive:PnPDeviceID
      ENDIF
NEXT
         
RETURN cDevice




//---------------------------------------------------------------------------------------//
STATIC FUNCTION InterDisco(oSrv,cDriveNumber)

LOCAL  oDisco:= oSrv:ExecQuery("SELECT * FROM Win32_DiskDrive")
LOCAL cInterf:= ""
LOCAL  oDrive

FOR Each oDrive In oDisco
      IF oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber
         cInterf:= oDrive:InterfaceType
      ENDIF
NEXT
         
RETURN cInterf




//---------------------------------------------------------------------------------------//
STATIC FUNCTION RevisaWMI()

LOCAL oWMI

    TRY
        oWMI:= CreateObject( "wbemScripting.SwbemLocator" )
  CATCH 
        oWMI:= Nil
        MSGStop("No se puede tener acceso a WMI","Permisos de Administrador")
    END
    
RETURN oWMI




//---------------------------------------------------------------------------------------//
STATIC FUNCTION IsDrive (cDrive)

LOCAL aDrv:= aDrives()

RETURN (ASCAN (aDrv, cDrive)!=0)
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon

Continue the discussion