#5590·Sandboxie

Configurable virtual motherboard/BIOS/OS serial number for sandboxed applications

Author: cbe256-cmykCreated Sep 6, 2026Updated Sep 11, 2026
LabelsFeature RequestFeature: Privacy

Is your feature request related to a problem or use case?

Some Windows applications use the motherboard serial number as part of their machine identity. For example, legacy software may be licensed to a particular PC by querying: Win32_BaseBoard.SerialNumber, Win32_BIOS.SerialNumber and Win32_OperatingSystem.SerialNumber.

This can create problems when the original hardware is no longer available, while the software itself is still legitimately usable. It would also be useful for testing and privacy purposes to have a stable, sandbox-specific hardware identity.

Sandboxie already has privacy-related options for hiding or obscuring various hardware identifiers, but applications using WMI can still receive the actual motherboard/BIOS/OS serial number.

Describe the solution you'd like

So the solution is to add an option to provide a custom, deterministic motherboard serial number inside a sandbox.

For example: When a sandboxed process queries: Win32_BaseBoard.SerialNumber it would receive the configured value instead of the physical motherboard's serial number: PrivacyMoBoSerial=24104502323232354

The host system and applications running outside the sandbox should continue to see the real value.

Ideally, the value would be:

  • configurable per sandbox;
  • persistent across sandbox restarts;
  • optionally generated automatically if no value is specified;
  • re-turned consistently to all supported WMI/API access methods;
  • completely isolated from the host's actual hardware information.

The same mechanism could potentially be extended to other hardware/OS identifiers:

PrivacyMoBoSerial=...
PrivacyBIOSSerial=...
PrivacyOSSerial=...

This could provide a more general concept of a virtual hardware identity for each sandbox.

For example, two sandboxes could have different stable identities:

[Sandbox1]
PrivacyMoBoSerial=...

[Sandbox2]
PrivacyMoBoSerial=...

While the host continues to expose the real hardware identifiers.

This would have legitimate uses beyond privacy:

  • running legacy applications whose licensing is tied to old hardware;
  • preserving software installations when migrating between physical PCs;
  • testing applications that use hardware identifiers;
  • reproducing a specific hardware environment during software testing;
  • keeping hardware identity stable inside disposable or resettable sandboxes;
  • improving privacy by preventing applications from learning the host's actual motherboard serial.

The important distinction from simply hiding the identifier is that applications which legitimately require a motherboard serial would receive a consistent virtual value, while the physical hardware identity remains unchanged outside the sandbox.

This would also complement the existing Sandboxie privacy features rather than replacing them.

Describe alternatives you've considered

I tried

HideFirmwareInfo=y
RandomRegUID=y

But they doesn't work for Win32_BaseBoard, Win32_BIOS, Win32_OperatingSystem

The actual code example that I used to get those params (it's the same on host and in sandbox with privacy enabled):

using System;
using System.Management;
using System.Security.Cryptography;
using System.Text;

class Program
{
    static void Main()
    {
        Console.WriteLine("=== Getting WMI test ===");
        Console.WriteLine();

        string baseBoardSerial = GetWmiSerial("Win32_BaseBoard");
        string biosSerial = GetWmiSerial("Win32_BIOS");
        string osSerial = GetWmiSerial("Win32_OperatingSystem");

        Console.WriteLine($"Win32_BaseBoard.SerialNumber      : [{baseBoardSerial}]");
        Console.WriteLine($"Win32_BIOS.SerialNumber            : [{biosSerial}]");
        Console.WriteLine($"Win32_OperatingSystem.SerialNumber : [{osSerial}]");
        Console.WriteLine();

    }

    static string GetWmiSerial(string wmiClass)
    {
        try
        {
            using (ManagementObjectSearcher searcher =
                   new ManagementObjectSearcher($"SELECT * FROM {wmiClass}"))
            {
                foreach (ManagementObject item in searcher.Get())
                {
                    object value = item.Properties["SerialNumber"]?.Value;

                    return value?.ToString() ?? string.Empty;
                }
            }
        }

}

Source: sandboxie-plus/Sandboxie