Recently somebody asked how to get the Hard Drive serial number in VB.NET.
The easy answer of course is to use VBScript with the WMI classes. Actually,
this gets the "Volume" serial number, not the hard-coded manufacturer's
hard drive serial number, which needs to be retrieved with custom software
that can vary by drive manufacturer. The "Volume" serial number
is created when you format a drive, and it can be changed without reformatting,
although in practice people rarely do so.
I thought it might be a good experiment to try and do this using the
native Windows API "GetVolumeInformation" instead, which requires
P/Invoke, in C#. This can be useful information for software and control
developers as it can be used to verify licensing for a single computer.
For example, on installation we could read the Volume Serial Number of
the user's C: drive in our Internet registration module, and have it submit
this to a webservice which uses the number as the
encryption key for a valid license key to "unlock" the product,
which would then be stored in the registry. If somebody attempted to install
a single - computer license product on another machine, the key would
The important issue with many of the API's is that you have to get the
parameter types correct for them to work with P/Invoke from managed code.
With "GetVolumeInformation", the signature looks as follows:
private static extern long GetVolumeInformation(string PathName, StringBuilder
VolumeNameBuffer, UInt32 VolumeNameSize, ref UInt32 VolumeSerialNumber,
ref UInt32 MaximumComponentLength, ref UInt32 FileSystemFlags, StringBuilder
FileSystemNameBuffer, UInt32 FileSystemNameSize);
Note that some of the parameters that you would think would be of type
"int" must be passed as "UInt32", which corresponds
to the .NET type "uint", and oftentimes a string must be passed
The actual method , with a string return value for convenience, looks
public string GetVolumeSerial(string strDriveLetter)
uint serNum = 0;
uint maxCompLen = 0;
StringBuilder VolLabel = new StringBuilder(256); // Label
UInt32 VolFlags = new UInt32();
StringBuilder FSName = new StringBuilder(256); // File System Name
strDriveLetter+=":\\"; // fix up the passed-in drive letter
for the API call
long Ret = GetVolumeInformation(strDriveLetter, VolLabel, (UInt32)VolLabel.Capacity,
ref serNum, ref maxCompLen, ref VolFlags, FSName, (UInt32)FSName.Capacity);
As can be seen, the API call returns much more information than just
the Volume Serial Number.
A complete class library, whose sole purpose in life is to do the above,
plus a Winforms test application, are available as a C# Solution with
the two projects in the zip file you can download below.
the code that accompanies this article
|Peter Bromberg is a C# MVP, MCP, and .NET consultant who has worked in the banking and financial industry for 20 years. He has architected and developed web - based corporate distributed application solutions since 1995, and focuses exclusively on the .NET Platform. |