Dudas con WMI y Select * From Win32_DiskDrive

Dudas con WMI y Select * From Win32_DiskDrive

Postby cuatecatl82 » Fri Jul 19, 2013 1: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: Select all  Expand view
#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: Select all  Expand view
LOCAL  oDisco:= oSrv:ExecQuery("Select * From Win32_DiskDrive")


Obtengo un error:

Code: Select all  Expand view
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..:roll: :roll: :roll:
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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Dudas con WMI y Select * From Win32_DiskDrive

Postby Antonio Linares » Fri Jul 19, 2013 3:04 pm

Victor,

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

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Dudas con WMI y Select * From Win32_DiskDrive

Postby Antonio Linares » Fri Jul 19, 2013 3:06 pm

En el segundo, cambiastes el orden de las variables:

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


debería ser:
Code: Select all  Expand view
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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Dudas con WMI y Select * From Win32_DiskDrive

Postby FranciscoA » Fri Jul 19, 2013 5:37 pm

Hola, cuatecatl82, aqui tienes otro ejemplo:

Code: Select all  Expand view
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
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Dudas con WMI y Select * From Win32_DiskDrive

Postby cuatecatl82 » Sat Jul 20, 2013 1:32 am

Gracias a ambos por Responder tan pronto:

Maestro Antonio: Como siempre enseñandonos, :P :P :lol: 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: Select all  Expand view
#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.. :wink: :wink: :lol: :lol: 8) 8)
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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Dudas con WMI y Select * From Win32_DiskDrive

Postby FranciscoA » Sat Jul 20, 2013 3:25 am

Victor,
Gracias por compartir tu código.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Dudas con WMI y Select * From Win32_DiskDrive

Postby cuatecatl82 » Sat Jul 20, 2013 6: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: Select all  Expand view


#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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 82 guests