![]() |
VOOZH | about |
dotnet add package DeviceId.Windows.Wmi --version 6.11.0
NuGet\Install-Package DeviceId.Windows.Wmi -Version 6.11.0
<PackageReference Include="DeviceId.Windows.Wmi" Version="6.11.0" />
<PackageVersion Include="DeviceId.Windows.Wmi" Version="6.11.0" />Directory.Packages.props
<PackageReference Include="DeviceId.Windows.Wmi" />Project file
paket add DeviceId.Windows.Wmi --version 6.11.0
#r "nuget: DeviceId.Windows.Wmi, 6.11.0"
#:package DeviceId.Windows.Wmi@6.11.0
#addin nuget:?package=DeviceId.Windows.Wmi&version=6.11.0Install as a Cake Addin
#tool nuget:?package=DeviceId.Windows.Wmi&version=6.11.0Install as a Cake Tool
A simple library providing functionality to generate a 'device ID' that can be used to uniquely identify a computer.
As of version 6, the packages have been split up so that users can pick-and-choose what they need, without having to pull down unnecessary references that they won't use:
You can pick-and-choose which packages to use based on your use case.
For a standard Windows app, the recommended packages are: DeviceId and DeviceId.Windows. If you want some extra advanced components you can also add DeviceId.Windows.Wmi.
PM> Install-Package DeviceId
PM> Install-Package DeviceId.Windows
Use the DeviceIdBuilder class to build up a device ID.
Here's a Windows-specific device ID, using the DeviceId.Windows package to get the built-in Windows Device ID.
string deviceId = new DeviceIdBuilder()
.OnWindows(windows => windows.AddWindowsDeviceId())
.ToString();
Here's a simple cross-platform one, using only the DeviceId package, which is valid for both version 5 and version 6 of the library:
string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddOsVersion()
.AddFileToken("example-device-token.txt")
.ToString();
Here's a more complex device ID, making use of some of the advanced components from the DeviceId.Windows.Wmi (or DeviceId.Windows.Mmi) package:
string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddOsVersion()
.OnWindows(windows => windows
.AddProcessorId()
.AddMotherboardSerialNumber()
.AddSystemDriveSerialNumber())
.ToString();
Here's a complex cross-platform device ID, using DeviceId.Windows.Wmi, DeviceId.Linux, and DeviceId.Mac:
string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddOsVersion()
.OnWindows(windows => windows
.AddProcessorId()
.AddMotherboardSerialNumber()
.AddSystemDriveSerialNumber())
.OnLinux(linux => linux
.AddMotherboardSerialNumber()
.AddSystemDriveSerialNumber())
.OnMac(mac => mac
.AddSystemDriveVolumeUUID()
.AddPlatformSerialNumber())
.ToString();
You can also generate a unique identifier for a database instance. Currently, only SQL Server is supported, but more may be added if there is demand and/or community support:
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
string databaseId = new DeviceIdBuilder()
.AddSqlServer(connection, sql => sql
.AddServerName()
.AddDatabaseName()
.AddDatabaseId())
.ToString();
The following extension methods are available out of the box to suit some common use cases:
From DeviceId:
AddUserName adds the current user's username to the device identifer.AddMachineName adds the machine name to the device identifier.AddOsVersion adds the current OS version to the device identifier. Note: This uses Environment.OSVersion, so if you're targeting older .NET Framework versions, you'll get different values compared to when you target more modern versions of .NET (.NET Core, .NET 5, .NET 6, and anything later than that).AddMacAddress adds the MAC address to the device identifier.AddFileToken adds a unique token stored in a file to the device identifier. The file is created if it doesn't already exist. Fails silently if no permissions available to access the file.From DeviceId.Windows:
AddWindowsDeviceId adds the Windows Device ID (also known as Machine ID or Advertising ID) to the device identifier. This value is the one displayed as "Device ID" in the Windows Device Specifications UI.AddWindowsProductId adds the Windows Product ID to the device identifier. This value is the one displayed as "Product ID" in the Windows Device Specifications UI.AddRegistryValue adds a specified registry value to the device identifier.AddMachineGuid adds the machine GUID from HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography to the device identifier.From DeviceId.Windows.Wmi / DeviceId.Windows.WmiLight / DeviceId.Windows.Mmi:
AddMacAddressFromWmi / AddMacAddressFromMmi adds the MAC address to the device identifier. These use the improved query functionality from WMI/MMI to provide additional functionality over the basic AddMacAddress method (such as being able to exclude non-physical device).AddProcessorId adds the processor ID to the device identifier. On ARM64 systems where ProcessorId is not available, it automatically falls back to a combination of Manufacturer, Name, and NumberOfCores.AddSystemDriveSerialNumber adds the system drive's serial number to the device identifier.AddMotherboardSerialNumber adds the motherboard serial number to the device identifier.AddSystemUuid adds the system UUID to the device identifier.From DeviceId.Linux:
AddSystemDriveSerialNumber adds the system drive's serial number to the device identifier.AddMotherboardSerialNumber adds the motherboard serial number to the device identifier. On ARM systems where DMI is not available, it falls back to the Device Tree model.AddMachineId adds the machine ID (from /var/lib/dbus/machine-id or /etc/machine-id) to the device identifier.AddProductUuid adds the product UUID (from /sys/class/dmi/id/product_uuid) to the device identifier. On ARM systems where DMI is not available, it falls back to the Device Tree serial number.AddCpuInfo adds CPU info (from /proc/cpuinfo) to the device identifier.AddDockerContainerId adds the Docker container identifier (from /proc/1/cgroup) to the device identifier.AddDeviceTreeSerialNumber adds the Device Tree serial number to the device identifier. This is typically available on ARM-based Linux systems.AddDeviceTreeModel adds the Device Tree model to the device identifier. This is typically available on ARM-based Linux systems.From DeviceId.Mac:
AddSystemDriveVolumeUUID adds the system drive's Volume UUID to the device identifier.AddPlatformSerialNumber adds IOPlatformSerialNumber to the device identifier.From DeviceId.SqlServer:
AddServerName adds the server name to the device identifier.AddDatabaseName adds the server name to the device identifier.AddDatabaseId adds the database ID to the device identifier.AddServerProperty adds a specified server property to the device identifier.AddServerProperty adds a specified extended property to the device identifier.Non physical network adapters like VPN connections tend not to have fixed MAC addresses. For wireless (802.11 based) adapters hardware (MAC) address randomization is frequently applied to avoid tracking with many modern operating systems support this out of the box. This makes wireless network adapters bad candidates for device identification.
Using the cross-platform AddMacAddress, you can exclude wireless network adapters like so:
string deviceId = new DeviceIdBuilder()
.AddMacAddress(excludeWireless: true)
.ToString();
If you're on Windows, you can also exclude non-physical adapters using the DeviceId.Windows.Wmi or DeviceId.Windows.Mmi packages like so:
string deviceId = new DeviceIdBuilder()
.AddMacAddress(excludeWireless: true)
.OnWindows(windows => windows
.AddMacAddressFromWmi(excludeWireless: true, excludeNonPhysical: true)
.ToString()
Use the UseFormatter method to set the formatter:
string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddOsVersion()
.UseFormatter(new HashDeviceIdFormatter(() => SHA256.Create(), new Base32ByteArrayEncoder()))
.ToString();
The "default" formatters are available in for quick reference. The default formatter changed between version 5 and version 6 of the library. If you're using version 6 but want to revert to the version 5 formatter, you can do so:
string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddOsVersion()
.UseFormatter(DeviceIdFormatters.DefaultV5)
.ToString();
For more advanced usage scenarios, you can use one of the out-of-the-box implementations of IDeviceIdFormatter in the DeviceId.Formatters namespace, or you can create your own.
There are a number of encoders that can be used customize the formatter. These implement IDeviceIdComponentEncoder and IByteArrayEncoder and are found in the DeviceId.Encoders namespace.
Let's say you shipped an app, and were using DeviceId to perform license checks. You may have done something like:
var currentDeviceId = new DeviceIdBuilder()
.AddMachineName()
.AddUserName()
.AddMacAddress()
.ToString();
var savedDeviceIdFromLicenseFile = ReadDeviceIdFromLicenseFile();
var isLicenseValid = currentDeviceId == savedDeviceIdFromLicenseFile;
Say you now want to release a new version of your app, and want to change how new device identifiers are generated (maybe just use MAC address and a file token), but you don't want to invalidate every single license file that currently exists. In other words, you want backwards compatible device ID validation.
In the latest version of DeviceId, you can use the DeviceIdManager to do so:
var deviceIdManager = new DeviceIdManager()
.AddBuilder(1, builder => builder
.AddMachineName()
.AddUserName()
.AddMacAddress())
.AddBuilder(2, builder => builder
.AddMacAddress()
.AddFileToken(TokenFilePath));
var savedDeviceIdFromLicenseFile = ReadDeviceIdFromLicenseFile();
var isLicenseValid = deviceIdManager.Validate(savedDeviceIdFromLicenseFile);
The device ID manager will work out which builder to use, and generate the current device ID in the correct format so that it can be sensibly compared to the device ID being validated.
Note that this functionality all works well but I'm not entirely happy with the naming or the API. I've currently built it so that there are no breaking changes for v6. In the future (v7 for example) I may rename some classes and break the API. In any case though I will keep the functionality, so it's safe to use this stuff.
There were a few breaking changes going from v5 to v6.
As mentioned above in the "What packages are needed" section, DeviceId was split into multiple packages, so you may need to add a reference to the packages for your platform (such as DeviceId.Windows, DeviceId.Windows.Wmi, DeviceId.Linux, etc.).
As mentioned above in the "Controlling how the device identifier is formatted" section, the default formatter changed between version 5 and version 6. If you're using version 6 but want to revert to the version 5 formatter, you can do so via .UseFormatter(DeviceIdFormatters.DefaultV5)
Some methods have been renamed or restricted to certain platforms. You can inspect the version 5.x methods and choose the corresponding new OS-specific methods. Note that these still may not be backwards compatible with a v5 device identifier due to the changes in the component names. Remember, if something is missing in v6 that you had in v5, you can always re-add it yourself via a custom component. Here are some examples of changes:
// V5:
builder.AddOSInstallationID();
// V6:
builder.OnWindows(x => x.AddMachineGuid())
.OnLinux(x => x.AddMachineId())
.OnMac(x => x.AddPlatformSerialNumber());
// V5:
builder.AddMotherboardSerialNumber();
// V6:
builder.OnWindows(x => x.AddMotherboardSerialNumber())
.OnLinux(x => x.AddMotherboardSerialNumber());
// not available on Mac
// V5:
builder.AddSystemUUID();
// V6:
builder.OnWindows(x => x.AddSystemUuid())
.OnLinux(x => x.AddProductUuid());
// not available on Mac
// V5:
builder.AddSystemUUID();
// V6:
builder.OnWindows(x => x.AddProcessorId())
.OnLinux(x => x.AddCpuInfo());
// not available on Mac
DeviceId provides ARM64 compatibility for both Windows and Linux platforms:
On Windows ARM64 systems, the AddProcessorId method automatically handles the absence of the x86-specific ProcessorId by falling back to a combination of processor attributes (Manufacturer, Name, and NumberOfCores).
string deviceId = new DeviceIdBuilder()
.OnWindows(windows => windows.AddProcessorId()) // Works on both x86/x64 and ARM64
.ToString();
On ARM-based Linux systems (such as Raspberry Pi, ARM servers, etc.), DMI (Desktop Management Interface) is typically not available. The following methods automatically fall back to Device Tree information:
AddProductUuid falls back to /sys/firmware/devicetree/base/serial-numberAddMotherboardSerialNumber falls back to /sys/firmware/devicetree/base/modelAdditionally, you can use the ARM-specific Device Tree methods directly:
string deviceId = new DeviceIdBuilder()
.OnLinux(linux => linux
.AddDeviceTreeSerialNumber() // ARM Device Tree serial number
.AddDeviceTreeModel()) // ARM Device Tree model
.ToString();
From version 5 onwards, the assemblies in this package are strong named for the convenience of those users who require strong naming. Please note, however, that the key files are checked in to this repository. This means that anyone can compile their own version and strong name it with the original keys. This is a common practice with open source projects, but it does mean that you shouldn't use the strong name as a guarantee of security or identity.
Copyright Matthew King 2015-2021. Distributed under the MIT License. Refer to license.txt for more information.
Community support is greatly appreciated. You can help in the following ways:
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 was computed. |
| .NET Framework | net35 net35 is compatible. net40 net40 is compatible. net403 net403 was computed. net45 net45 was computed. net451 net451 was computed. net452 net452 was computed. net46 net46 was computed. net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
Showing the top 5 NuGet packages that depend on DeviceId.Windows.Wmi:
| Package | Downloads |
|---|---|
|
DeepThink.ApiLib
Package Description |
|
|
GSS.Portable.Licensing
Portable.Licensing is a cross platform software licensing framework which allows you to implement licensing into your application or library. It provides you all tools to create and validate licenses for your software. Portable.Licensing is uses the RSA(cryptosystem) with XML Signature to help you ensure that your software is protected. |
|
|
SincAhelper1
SincA Helper |
|
|
iolo.Licensing.SDK.Client
iolo Licensing SDK Client |
|
|
BlueByte.Licensing
Licensing Components for Blue Byte Systems Inc products |
Showing the top 3 popular GitHub repositories that depend on DeviceId.Windows.Wmi:
| Repository | Stars |
|---|---|
|
babalae/better-genshin-impact
📦BetterGI · 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪 - UI Automation Testing Tools For Genshin Impact
|
|
|
LykosAI/StabilityMatrix
Multi-Platform Package Manager for Stable Diffusion
|
|
|
ProtonVPN/win-app
Official ProtonVPN Windows app
|
| Version | Downloads | Last Updated |
|---|---|---|
| 6.11.0 | 14,368 | 3/12/2026 |
| 6.10.0 | 5,611 | 2/23/2026 |
| 6.9.0 | 126,726 | 3/19/2025 |
| 6.8.0 | 93,155 | 12/2/2024 |
| 6.6.0 | 259,357 | 11/16/2023 |
| 6.5.1 | 4,233 | 11/8/2023 |
| 6.5.0 | 34,603 | 9/19/2023 |
| 6.4.0 | 17,003 | 8/28/2023 |
| 6.2.1 | 128,486 | 2/27/2023 |
| 6.2.0 | 200,208 | 1/19/2022 |
| 6.2.0-alpha.1639637967 | 424 | 12/16/2021 |
| 6.1.0 | 110,711 | 8/25/2021 |
| 6.0.0 | 2,781 | 8/13/2021 |
| 6.0.0-alpha.1627605816 | 518 | 7/30/2021 |
| 6.0.0-alpha.1627469720 | 417 | 7/28/2021 |