#  WMIDisks.pl
#  Example 9.13:
#  ----------------------------------------
#  From "Win32 Perl Scripting: Administrators Handbook" by Dave Roth
#  Published by New Riders Publishing.
#  ISBN # 1-57870-215-1
#
#  This script displays information about disks on a remote machine.
#
print "From the book 'Win32 Perl Scripting: The Administrator's Handbook' by Dave Roth\n\n";


use Win32;
use Win32::OLE qw( in );

%TYPE = (
  0   =>  'Unknown',
  1   =>  'No root',
  2   =>  'Removable',
  3   =>  'Local',
  4   =>  'Network',
  5   =>  'CDRom',
  6   =>  'RAM Disk'
);

push( @ARGV, Win32::NodeName() ) if( ! scalar @ARGV );
foreach my $Machine ( @ARGV )
{
  # Remove any backslashes
  $Machine =~ s/\\+//;
  my $CLASS = "WinMgmts:{impersonationLevel=impersonate}!//$Machine";
  print "\\\\$Machine\n";
  if( my $WMI = Win32::OLE->GetObject( $CLASS ) )
  {
    local $Disk;

    $~ = DISK_HEADER_FORMAT;
    write;
    $~ = DISK_FORMAT;
    foreach $Disk ( in( $WMI->InstancesOf( "Win32_LogicalDisk" ) ) )
    {
      local $Drive = $TYPE{$Disk->{DriveType}};
      local %Size = (
        total =>  FormatNumber( $Disk->{Size} ),
        free  =>  FormatNumber( $Disk->{FreeSpace} )
      );
      write;
    }
  }
  print "\n";
}

sub FormatNumber 
{
  my( $Number ) =@_;
  while( $Number =~ s/^(-?\d+)(\d{3})/$1,$2/ ){};
  return( $Number );
}

format DISK_HEADER_FORMAT =
    FS    Type      Size                  Free
--- ----- --------- --------------------- ---------------------
.
format DISK_FORMAT =
@<< @<<<< @<<<<<<<< @>>>>>>>>>>>>>>>>>>>> @>>>>>>>>>>>>>>>>>>>>
$Disk->{Name}, $Disk->{FileSystem}, $Drive, $Size{total}, $Size{free}
.
