Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

(Win32) Hard Drive Information

by Mr. Muskrat (Canon)
on Mar 27, 2004 at 04:10 UTC ( #340212=snippet: print w/replies, xml ) Need Help??

Gather all sorts of information about your hard drives. If you are running Windows XP or Server 2003, that information will include the hard drives serial number if it has one.

This was based heavily on that was the example used in Dave Roth's article on Using WMI to Request Data About Disk Drives.

use strict;
use Win32::OLE qw( in );

  'Unknown', 'Other', 'Sequential Access', 'Random Access', 'Supports 
  'Encryption', 'Compression', 'Supports Removable Media',
  'Manual Cleaning', 'Automatic Cleaning'
my $TotalSize = 0;
my $Machine = shift @ARGV || ".";
$Machine =~ s/^[\\\/]+//;
my $WMIServices = Win32::OLE->GetObject( "winmgmts:{impersonationLevel
+=impersonate,(security)}//$Machine" ) || die;

my (@drives, %serial);

my $DriveCollection = $WMIServices->InstancesOf( "Win32_DiskDrive" );
foreach my $Drive ( in( $DriveCollection ) ) {
  push @drives, $Drive;

my $PhysMedia = $WMIServices->InstancesOf( "Win32_PhysicalMedia" );

foreach my $Drive ( in( $PhysMedia ) ) {
  my $name = (split(/=/, $Drive->{Path_}->relpath))[1];
  $serial{eval $name} = $Drive->{SerialNumber};

foreach my $Drive (@drives) {
  print "Name: $Drive->{Name}\n";
  print "  Manufacturer: $Drive->{Manufacturer}\n";
  print "  Media Type: $Drive->{MediaType}\n";
  print "  Description: $Drive->{Description}\n";
  print "  Drive type: $Drive->{InterfaceType}\n";
  print "  Model: ", $Drive->{Model} || "Unknown", "\n";
  print "  Caption: $Drive->{Caption}\n";
  print "  SerialNumber: $serial{$Drive->{Name}}\n";
  print "  PNPDeviceID: $Drive->{PNPDeviceID}\n";
  print "  Signature: $Drive->{Signature}\n";
  print "  Partitions: $Drive->{Partitions}\n";
  print "  Size: ", FormatNumber( $Drive->{Size} ), " bytes\n";
  print "  Capabilities:\n";
  my $CapabilityList = $Drive->{Capabilities} || [];
  foreach my $Cap ( @{$CapabilityList }  ) {
    print "    $CAPABILITIES[$Cap]\n";
  print "\n";
  $TotalSize += $Drive->{Size};
print "Total drive space: ", FormatNumber( $TotalSize ), " bytes\n";

sub FormatNumber {
    my($Number) = @_;
    while( $Number =~ s/^(-?\d+)(\d{3})/$1,$2/ ){};
    return( $Number );

  Manufacturer: (Standard disk drives)
  Media Type: Fixed hard disk media
  Description: Disk drive
  Drive type: IDE
  Model: Maxtor 6Y120P0
  Caption: Maxtor 6Y120P0
  SerialNumber: Y435RELE
  PNPDeviceID: IDE\DISKMAXTOR_6Y120P0__________________________YAR41BW
  Signature: 169678702
  Partitions: 3
  Size: 122,935,034,880 bytes
    Random Access
    Supports Writing

Total drive space: 122,935,034,880 bytes
Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://340212]
[ambrus]: choroba: heh heh... I have such a doc bug report somewhere. fixed by now.
[Corion]: Once upon a time I had automatic tests for checking the synopsis, but I stopped doing that because the setup was too fragile on CPAN testers for extracting code from the SYNOPSIS.
[Corion]: Maybe I should move the extraction of the code from the SYNOPSIS section into the author tests, or something like that...
[choroba]: Corion Sounds reasonable
[Corion]: choroba: Yeah - I basically have the same for regenerating README and README.mkdown already, except that I do that in Makefile.PL, but I guess one or the other thing should somehow work ;)
[ambrus]: was this bug: https://rt.cpan. org/Public/Bug/ Display.html?id= 59814

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (8)
As of 2017-02-27 12:12 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (383 votes). Check out past polls.