Jump to content
Belini

Código para pegar o serial de Hd's e pendrives.

Recommended Posts

@joelson0007 ou quem puder ajudar, estou com um problema para usar o script postado na mensagem #45, o que acontece é que dá erro se eu tiver uma gaveta USB destasusadas para ler HD conectada, parece que dectecta como dispositivo USB mais dá erro para pegar a ID dela, o que posso fazer para não d´este erro?

 

 

For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition^ ERROR

Share this post


Link to post
Share on other sites

Pelo jeito a solução deste problema é bem mais complicada do que imaginei pois nem no forum oficial conseguiram resolver.

Share this post


Link to post
Share on other sites

Pelo jeito a solução deste problema é bem mais complicada do que imaginei pois nem no forum oficial conseguiram resolver.

Isso se deve ao fato de envolver conhecimentos no protocolo serial USB em conjunto com as APIs do windows!

 

JS

Share this post


Link to post
Share on other sites

Em outras palavras difícil de resolver né :(

 

EDITADO: Vc conhece alguma outra função que informe com precisão se é um pendrive e qual a letra dele?

Edited by Belini

Share this post


Link to post
Share on other sites

Não conheço pois mas vou verificar pra isso você, pois como eu já afirmei, não depende somente de conhecimento em programação, mas sim de estruturas que envolvem protocolos e APIs específicas para isso...

 

Veja:

image006.gif.jpg

 

Leia:

http://www.ece.ufrgs.br/~fetter/eng04476/usb.pdf

 

JS

Share this post


Link to post
Share on other sites

Ví o pdf e continuei na mesma sem saber o que está causando ou como evitar que este erro apareça e feche o script.

Share this post


Link to post
Share on other sites

Ok, eu terei que viajar na sexta feira e só volto na segunda pela manhã, daí eu já vou ver a respeito disso amigo pois se resolvermos já será um desafio que servirá para outros usuários com certeza!

 

Até mais,

 

JS

Share this post


Link to post
Share on other sites

@belini não entendi essa parte.

 

USB destasusadas

 

parece que está falando de case para hd?

 

se sim, qual marca?

Edited by joelson0007

Share this post


Link to post
Share on other sites

de uma olhada belini, acredito que essa case não tem valor DeviceID

 

 
#include <Array.au3>
#include <String.au3>
 
getUsbSerial()
 
Func getUsbSerial()
    Local $letter[1], $disk[1], $aArray[1][2], $i, $informat = '', $espaco = ''
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2")
    Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x10 + 0x20)
    For $objitem In $colItems
        If $objitem.interfacetype = "USB" And $objitem.DeviceId Then
            For $partition In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $objitem.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
            Next
            For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
            Next
            $aRegExSer = StringRegExp($objitem.pnpdeviceid, "\x5C([0-9a-fxA-FX]+)&", 3)
            If IsArray($aRegExSer) Then
                $i += 1
                $informat = ""
                _ArrayAdd($disk, $aRegExSer[0])
                _ArrayAdd($letter, $loDisk.DeviceId)
                $espaco = DriveSpaceTotal($letter[$i]) / 1024
                $espaco = StringMid($espaco, 1, StringInStr($espaco, ".", 2, 1) + 2) & " GB"
                MsgBox('', '', "Letra do pendrive = " & $letter[$i] & @CRLF & "Tamanho pendrive = " & $espaco & @CRLF & _
                        "Serial = " & $disk[$i] & @CRLF & "Nome = " & $objitem.Caption & @CRLF & "ID = " & $objitem.PNPDeviceID)
            EndIf
        EndIf
    Next
EndFunc   ;==>getUsbSerial

Share this post


Link to post
Share on other sites

O erro continua, veja:

 

"E:\Novo(a) AutoIt v3 Script.au3" (15) : ==> Variable must be of type "Object".:
For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition^ ERROR

Share this post


Link to post
Share on other sites

mais uma modificação

 
#include <Array.au3>
#include <String.au3>
 
getUsbSerial()
 
Func getUsbSerial()
    Local $letter[1], $disk[1], $aArray[1][2], $i, $informat = '', $espaco = ''
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2")
if IsObj($objWMIService) then
    Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x10 + 0x20)
 
    For $objitem In $colItems
        If $objitem.interfacetype = "USB" And $objitem.DeviceId Then
            For $partition In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $objitem.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
            Next
            For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
            Next
            $aRegExSer = StringRegExp($objitem.pnpdeviceid, "\x5C([0-9a-fxA-FX]+)&", 3)
            If IsArray($aRegExSer) Then
                $i += 1
                $informat = ""
                _ArrayAdd($disk, $aRegExSer[0])
                _ArrayAdd($letter, $loDisk.DeviceId)
                $espaco = DriveSpaceTotal($letter[$i]) / 1024
                $espaco = StringMid($espaco, 1, StringInStr($espaco, ".", 2, 1) + 2) & " GB"
                MsgBox('', '', "Letra do pendrive = " & $letter[$i] & @CRLF & "Tamanho pendrive = " & $espaco & @CRLF & _
                        "Serial = " & $disk[$i] & @CRLF & "Nome = " & $objitem.Caption & @CRLF & "ID = " & $objitem.PNPDeviceID)
            EndIf
        EndIf
    Next
 EndIf
EndFunc   ;==>getUsbSerial

Com que privilégio está sendo executado esse script?

Edited by joelson0007

Share this post


Link to post
Share on other sites

Infelizmente o erro continua, se tivesse como colocar uma função para prevenir e não deixar que o script fechasse tipo o @error resolveria o problema só não sei se tem como e onde colocaria isto.

Share this post


Link to post
Share on other sites

está fácil resolver isso, porem sempre que der um erro me passe ele, pois no meu pc não esta acontecendo os erros, então fica complicado eu debugar .

 

mais uma modificação

 

 

 
#include <Array.au3>
#include <String.au3>
 
getUsbSerial()
 
Func getUsbSerial()
Local $letter[1], $disk[1], $aArray[1][2], $i, $informat = '', $espaco = ''
Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2")
If IsObj($objWMIService) Then
Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x10 + 0x20)
For $objitem In $colItems
If $objitem.interfacetype = "USB" And $objitem.DeviceId Then
For $partition In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $objitem.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
Next
 
If ($partition.DeviceId) Then
For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
Next
 
$aRegExSer = StringRegExp($objitem.pnpdeviceid, "\x5C([0-9a-fxA-FX]+)&", 3)
If IsArray($aRegExSer) Then
$i += 1
$informat = ""
_ArrayAdd($disk, $aRegExSer[0])
_ArrayAdd($letter, $loDisk.DeviceId)
$espaco = DriveSpaceTotal($letter[$i]) / 1024
$espaco = StringMid($espaco, 1, StringInStr($espaco, ".", 2, 1) + 2) & " GB"
MsgBox('', '', "Letra do pendrive = " & $letter[$i] & @CRLF & "Tamanho pendrive = " & $espaco & @CRLF & _
"Serial = " & $disk[$i] & @CRLF & "Nome = " & $objitem.Caption & @CRLF & "ID = " & $objitem.PNPDeviceID)
EndIf
EndIf
EndIf
Next
EndIf
EndFunc   ;==>getUsbSerial

Share this post


Link to post
Share on other sites

Vou passando sim e neste último continua o erro.

 

 

"D:\teste.au3" (17) : ==> Variable must be of type "Object".:
If ($partition.DeviceId) Then
If ($partition^ ERROR

Share this post


Link to post
Share on other sites

mais uma

 

 

 
#include <Array.au3>
#include <String.au3>
 
getUsbSerial()
 
Func getUsbSerial()
Local $letter[1], $disk[1], $aArray[1][2], $i, $informat = '', $espaco = ''
Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2")
If IsObj($objWMIService) Then
Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x10 + 0x20)
For $objitem In $colItems
If $objitem.interfacetype = "USB" And $objitem.DeviceId Then
For $partition In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $objitem.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
Next
 
If (IsObj($partition) and $partition.DeviceId ) Then
For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
Next
 
$aRegExSer = StringRegExp($objitem.pnpdeviceid, "\x5C([0-9a-fxA-FX]+)&", 3)
If IsArray($aRegExSer) Then
$i += 1
$informat = ""
_ArrayAdd($disk, $aRegExSer[0])
_ArrayAdd($letter, $loDisk.DeviceId)
$espaco = DriveSpaceTotal($letter[$i]) / 1024
$espaco = StringMid($espaco, 1, StringInStr($espaco, ".", 2, 1) + 2) & " GB"
MsgBox('', '', "Letra do pendrive = " & $letter[$i] & @CRLF & "Tamanho pendrive = " & $espaco & @CRLF & _
"Serial = " & $disk[$i] & @CRLF & "Nome = " & $objitem.Caption & @CRLF & "ID = " & $objitem.PNPDeviceID)
EndIf
EndIf
EndIf
Next
EndIf
EndFunc   ;==>getUsbSerial

Share this post


Link to post
Share on other sites

Agora sim tudo ok :600866: vc é fera mesmo, nem o pessoal do forum oficial que sabe tudo de Autoit conseguiu resolver, parabéns e obrigado pela ajuda.

  • Like 1

Share this post


Link to post
Share on other sites

Já uso este seu código faz tempo e o único que apareceu até agora foi este e acho que não vai aparecer mais nenhum.

Share this post


Link to post
Share on other sites

Achei melhor reviver o tópico do que criar outro pois é relativo ao último script postado aqui pelo @joelson0007, o que acontece é que no win7 64 bits retorna corretamente todas informações do pendrive menos o serial, alguém tem alguma dica de como resolver?

#include <Array.au3>
#include <String.au3>

getUsbSerial()

Func getUsbSerial()
    Local $letter[1], $disk[1], $aArray[1][2], $i, $informat = '', $espaco = ''
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2")
    If IsObj($objWMIService) Then
        Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x10 + 0x20)
        For $objitem In $colItems
            If $objitem.interfacetype = "USB" And $objitem.DeviceId Then
                For $partition In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $objitem.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
                Next

                If (IsObj($partition) And $partition.DeviceId) Then
                    For $loDisk In $objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
                    Next

                    $aRegExSer = StringRegExp($objitem.pnpdeviceid, "\x5C([0-9a-fxA-FX]+)&", 3)
                    If IsArray($aRegExSer) Then
                        $i += 1
                        $informat = ""
                        _ArrayAdd($disk, $aRegExSer[0])
                        _ArrayAdd($letter, $loDisk.DeviceId)
                        $espaco = DriveSpaceTotal($letter[$i]) / 1024
                        $espaco = StringMid($espaco, 1, StringInStr($espaco, ".", 2, 1) + 2) & " GB"
                        MsgBox('', '', "Letra do pendrive = " & $letter[$i] & @CRLF & "Tamanho pendrive = " & $espaco & @CRLF & _
                                "Serial = " & $disk[$i] & @CRLF & "Nome = " & $objitem.Caption & @CRLF & "ID = " & $objitem.PNPDeviceID)
                    EndIf
                EndIf
            EndIf
        Next
    EndIf
EndFunc   ;==>getUsbSerial

 

 

Imagem.JPG

Share this post


Link to post
Share on other sites

@Manimal no script completo tem sim e sempre coloco em todos scripts este aqui apenas copiei do @joelson0007 mas mesmo colocando nele continua sem retornar o serial.

Share this post


Link to post
Share on other sites

@Manimal este outro programa que vc usou para mostrar as informações do pendrive aceita linha de comando e salva as informações em .txt?

Share this post


Link to post
Share on other sites

Olá Belini.

Não tinha testado ainda mas sim. Só chamar com a opção /RD, mas tem mais opções: olha com /?.

Este programa vem junto com o USBDLM, que é um programa que eu uso para "fixar" a letra da USB nos clientes e para mim é o mais completo para mostrar informações dos pendrives.

UsbDriveInfo.zip

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×