Baike.dev
All toolsOnline toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
D

DeviceId

> 编程语言
Open source

A simple library providing functionality to generate a 'device ID' that can be used to uniquely identify a computer.

877 stars0 likes1 views
WebsiteGitHub

About

A simple library providing functionality to generate a 'device ID' that can be used to uniquely identify a computer.

DeviceId

A simple library providing functionality to generate a 'device ID' that can be used to uniquely identify a computer.

Quickstart

What packages are needed?

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:

  • The main DeviceId package contains the core functionality and a number of cross-platform components.
  • The DeviceId.Windows package adds a few Windows-specific components.
  • The DeviceId.Windows.Wmi package adds even more Windows-specific components, using WMI.
  • The DeviceId.Windows.WmiLight package adds the same components as above, but using WmiLight instead of WMI.
  • The DeviceId.Windows.Mmi package adds the same components as above, but using MMI instead of WMI for those instances where WMI isn't appropriate (such as where no .NET Framework is present on the machine).
  • The DeviceId.Linux package adds a few Linux-specific components.
  • The DeviceId.Mac package adds a few Mac-specific components.
  • The DeviceId.SqlServer package adds support for generating a database ID for SQL Server databases.

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

Building a device identifier

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.

csharp
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:

csharp
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:

csharp
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:

csharp
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:

csharp
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
string databaseId = new DeviceIdBuilder()
    .AddSqlServer(connection, sql => sql
        .AddServerName()
        .AddDatabaseName()
        .AddDatabaseId())
    .ToString();

What can you include in a device identifier

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.

Dealing with MAC Address randomization and virtual network adapters

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:

csharp
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:

csharp
string deviceId = new DeviceIdBuilder()
    .AddMacAddress(excludeWireless: true)
    .OnWindows(windows => windows
        .AddMacAddressFromWmi(excludeWireless: true, excludeNonPhysical: true)
    .ToString()

Controlling how the device identifier is formatted

Use the UseFormatter method to set the formatter:

csharp
string deviceId = new DeviceIdBuilder()
    .AddMachineName()
    .AddOsVersion()
    .UseFormatter(new HashDeviceIdFormatter(() => SHA256.Create(), new Base32ByteArrayEncoder()))
    .ToString();

The "default" formatters are available in DeviceIdFormatters 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:

csharp
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.

  • StringDeviceIdFormatter - Formats the device ID as a string containing each component ID, using any desired component encoding.
  • HashDeviceIdFormatter - Formats the device ID as a hash string, using any desired hash algorithm and byte array encoding.
  • XmlDeviceIdFormatter - Formats the device ID as an XML document, using any desired component encoding.

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.

  • PlainTextDeviceIdComponentEncoder - Encodes a device ID component as plain text.
  • HashDeviceIdComponentEncoder - Encodes a device ID component as a hash string, using any desired hash algorithm.
  • HexByteArrayEncoder - Encodes a byte array as a hex string.
  • Base32UrlByteArrayEncoder - Encodes a byte array as a base 64 url-encoded string.
  • Base64ByteArrayEncoder - Encodes a byte array as a base 64 string.
  • Base64UrlByteArrayEncoder - Encodes a byte array as a base 64 url-encoded string.

Supporting/validating multiple device ID formats with backwards compatibility

Let's say you shipped an app, and were using DeviceId to perform license checks. You may have done something like:

csharp
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

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

C#

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言