When managing a large number of virtual machines, there is often a need to tag it in some way with one or more properties uniquely identifying it for administrative purposes. One example would be to identify a virtual machine as belonging to a person, team or business unit.
The Hyper-V WMI namespace has a number of BIOS properties which can be set when a virtual machine is turned off. As these properties are part of the virtual machine configuration, they are separate from the VHD or backing storage used by the virtual machine. These properties can also be read from within a guest operating system.
Gforce Virtual String Machine Vsti Serial Numbers. Convert Gforce Virtual String Machine Vsti trail version to full software. G-force Virtual String Machine Serial Numbers. Convert G-force Virtual String Machine trail version to full software. LinkKeygen Dist. The Keygen Dist API is a hosted distribution server for your Keygen products. For some licensing models e.g. One which requires a machine fingerprint scope, this may introduce a catch-22. Linkmachine string, optional. The machine identifier (UUID) to scope the license validation to.
To start with, let’s look at the following four properties and the default values they are initialized to when a virtual machine is created:
Property | Default value |
BIOSSerialNumber | Randomly generated |
BaseBoardSerialNumber | Same value as BIOSSerialNumber |
ChassisSerialNumber | Same value as BIOSSerialNumber |
ChassisAssetTag | Randomly generated (but different to BIOSSerialNumber |
All these properties are numeric and in the format 'XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XX'.
Windows provides WMI classes that expose these settings inside a guest operating system. The table below shows the relationship between the WMI properties of the virtual machine and WMI properties as seen by a guest operating system.
Property of Msvm_VirtualSystemSettingData | WMI class & property in guest operating system |
BIOSSerialNumber | Win32_BIOS.SerialNumber |
BaseBoardSerialNumber | Win32_BaseBoard.SerialNumber |
ChassisSerialNumber | Win32_SystemEnclosure.SerialNumber |
ChassisAssetTag | Win32_SystemEnclosure.SMBIOSAssetTag |
To illustrate how these values can be queried, I set the values to something less random and more easily identifiable. Here’s a partial output of a query against Msvm_VirtualSystemSettingData obtained using the wbemtest application on the parent partition. (Ignore the BIOSGUID property for a few moments).
instance of Msvm_VirtualSystemSettingData
{
BaseBoardSerialNumber = '2222-2222-2222-2222-2222-2222-22';
BIOSGUID = '{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}';
BIOSSerialNumber = '1111-1111-1111-1111-1111-1111-11';
ChassisAssetTag = '4444-4444-4444-4444-4444-4444-44';
ChassisSerialNumber = '3333-3333-3333-3333-3333-3333-33';
};
The next step was to generate something to query the WMI properties inside the guest operating system. I used a bit of scriptomatic assistance to come up with the following bit of VBScript – there’s plenty of other alternatives around of course including wbemtest again, a bit of PowerShell, ...
This yielded the following output:
So the last problem I had to solve was the BIOSGUID value which I’d set in the virtual machine configuration to AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE. I use the word “problem” because I couldn’t see where or if this was propagated to the guest operating system in the WMI namespace. Nothing like a good challenge… 🙂
As searching the WMI namespace drew blank (or to be more accurate I missed it), I turned to some other thoughts. First was a registry search, but that also drew a blank.
I did know that the BIOS GUID is used during PXE boot – here’s a screenshot of the same virtual machine configured with a legacy network adapter for PXE install – you can see the contrived GUID being displayed:
Next call was a utility I found from an Internet Search called ROM BIOS Explorer. Here’s a screenshot of it running inside the guest operating system. As you can see from the hex-dump on the left hand side, starting at the highlight at offset 0x49, you can see the contrived GUID clearly. The utility also indicates it’s in the “Type 1: System Information” structure in the BIOS.
So that means the information is there – it was just a question of how to access it from inside the guest operating system. Next stop was an Internet search for Type 1: System Information which yielded (among others), this document about SMBIOS on Microsoft.com.
This shows that the table contains a Serial Number and UUID (another term for a GUID). So back to the Internet to refine the search to include the term “UUID” which led me to a pretty old SMS document which had exactly what I was looking for: Type 1, System Information UUID is exposed in Win32_ComputerSystemProduct.
Back to scriptomatic to do a query, and it was there all along!
There's also one other useful link I found along the way. To see a sample script on how to modify Msvm_VirtualSystemSettingData please see here.
Cheers,
John.
PS Thanks to my colleague Frank Berreth for pulling much of the information for this post together.
I have question how to generate unique serial number of machine in Delphi? I tried to do this using the ID the motherboard or processor, but unfortunately it's unfortunately supported. Partition serial numbers, etc. fall off, because it is changing after the formatted. I'm looking for something that doesn't change after the formatted. Has anyone any idea?
dsolimano7 Answers
Inside JCL library, there are several functions very usefull for this topic:
TridenTTridenTWhat you're after is actually some sort of 'hardware fingerprint', not an 'serial number'. The problem with this approach is that it's not 100% reliable. Proof: Microsoft didn't manage to find a way to properly limit OEM software to any single computer, you can actually re-install a OEM license on a new computer after a while! Once you agree there can't be a perfect solution you may look at your options and try getting something that's good enough.
For my applications I'm creating a fingerprint based on info returned by GetSystemInfo, GetVolumeInformation and (for the 'C:' partition) and a selection of registry keys from HKLMHARDWARE (lots of registry keys actually, everything but usb, keyboard and mouse stuff). I'm reading hardware information from the registry because a Windows application can't really access hardware directly (DOS-style approaches can't work), and because I don't have time to figure out ways to determine hardware-related information for many different devices.
My approach has the following disadvantages:
- Uses the partition serial number, as set up by Format. An format would clearly change the fingerprint.
- Uses information about the installed drivers. Updating an driver might actually change the fingerprint! Moving a card from one PCI port to an other might change the fingerprint.
None the less, even with all of this changing information taken into account, I get collisions: Something like 1/1000 computers! There are several factors at work here:
- Big OEM build many computers using the same hardware. They also clone HDD's in order to speed up software installation so different PC's might get the same partition serial number.
- I'm building a very short hash from all that information, short enough so people can read it to me on the phone without too many mistakes.
This system works for me, but it will not work for you if you expect to re-identify computers once they're reinstalled.
Cosmin PrundCosmin PrundYou can test GLibWMI that extract information of several components on Windows.
It's free and source included. You can find it on my Web or in Sourceforge.
Include components for BIOSInfo, DiskInfo, ProcessorInfo,...
With this three components you can obtain information like this:
You can find the BIN/EXE of GenericDemo (all components) here; You can test all information that you can retrive with this components.
Virtual String Machine
I had a similar problem back in the good old DOS days. I found out that the ROM of the installed hardware ie. video card, disk controllers seriel ports etc. was accessible directly, since they are memory-mapped. This means that I was able to create a list of installed hardware, and use it to generate a 'serial number', that uniquely identified each computer (until the hardware setup was changed). I'm sure something similar is possible today as well.
Check out http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map, if you want to use this approach.
Regards
- Frank
Often the MAC address of the (a) network card is used, there are several ways to query the mac address (in Delphi) but the easiest/cleanest way is probably to use the GetAdaptersInfo API.
RemkoRemkoHere is a simple solution
- Generate a GUID
- Save the Guid value in the registry
Use the value of the guid as the serial number
If you a worried about security use a hash over the ( Guid + some secret data)
Charles FaigaCharles FaigaI tend to agree with the 'it can't be done' camp. At least not 100%, but it can probably be done 'good enough' to keep the average user in line.
Virtual String Machine Geforce
And if it can be done then it probably has been done. Did you check Torry's Delpi300, etc (maybe even sourceforge, although you might have to translate into Delphi).
http://www.google.com.sg/search?hl=en&source=hp&q=How+to+generate+unique+serial+number+of+machine+in+Delphi actually looks promising
MawgMawg