获取离线安装 ID(Windows 8 或类似)

Get Offline Installation ID (Windows 8 or similar)

是否可以获取 Windows 离线安装 IDOfflineInstallationId 在 slmgr.vbs)?

这可以通过命令行实现:

slmgr.vbs /dti

这个 returns 没有空格或破折号的安装 ID,是否可以在 C# 中检索它? 我想最终将 ID 的每个块(有 9 个块,每个块中有 7 个数字)放在表单上各自的文本框中。

有 9 个方块,每个方块有 7 个数字

我环顾四周,但找不到任何 C# 示例。

这可以通过查询 WMI(Windows Management Instrumentation)的 Win32_WindowsProductActivation(XP 及以下版本)或 SoftwareLicensingProduct(Vista 或更高版本)class 来实现:

需要声明这些命名空间:

  • 系统
  • System.Collections.Generic
  • System.Management
  • System.Text

使用 using 在代码文件的 顶部 声明这些命名空间,按照本身:

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

然后在函数中使用以下代码:

ManagementScope Scope;
Scope = new ManagementScope("\\.\ROOT\cimv2");
Scope.Connect();
ObjectQuery Query = new ObjectQuery("SELECT OfflineInstallationId FROM SoftwareLicensingProduct");
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
foreach (ManagementObject WmiObject in Searcher.Get())
{
    //Do whatever with the Offline Installation ID here.   
}

我注意到因为我使用了一次 Windows 8.1 的 'refresh' 功能,我的 WMI 为我返回了 两个 离线安装 ID,因此这应该是您需要考虑的事情(第一个离线安装 ID 是 有效的 ):

您可能想要类似这样的东西:

static string getOfflineInstallId()
{
    ManagementScope Scope;
    Scope = new ManagementScope("\\.\ROOT\cimv2");
    Scope.Connect();
    ObjectQuery Query = new ObjectQuery("SELECT OfflineInstallationId FROM SoftwareLicensingProduct");
    ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

    foreach (ManagementObject WmiObject in Searcher.Get())
    {
        if (WmiObject["OfflineInstallationId"] != null)
            return WmiObject["OfflineInstallationId"].ToString();
    }
    return ""; //Making the compiler happy.
}

如前所述,SoftwareLicensingProductOfflineInstallationId 仅适用于比 Vista 更新的 Windows 版本(例如,Vista、7、8、8.1 和 10),因此如果您(或您程序的用户)希望在 XP 或更早版本上使用它,您 可能 能够使用以下内容,但是由于我无法访问 XP 我无法测试一下:

ObjectQuery Query = new ObjectQuery("SELECT GetInstallationID FROM Win32_WindowsProductActivation");

如果你想把ID的每一块分开,插入到一个TextBox到一个Windows窗体(WinForm)中,你可以使用下面的代码:

string installId = getOfflineInstallId();
StringBuilder sb = new StringBuilder();
bool fRun = false;
for (int i = 0; i < installId.Length; i++)
{
    if (i % 7 == 0)
    {
        if (fRun)
            sb.Append('-');
        else
            fRun = true; //Stops a '-' being added at the 1st position.
    }
    sb.Append(installId[i]);
}
idTextBox.Text = sb.ToString();

像这样:

除此之外,您还需要引用 System.Management 库,方法是在解决方案资源管理器中右键单击 引用 ,然后单击 Add New Reference , 并将 System.ManagementSystem.Management.Instrumentation 添加到项目中:

本例中使用的项目可以下载here需要Visual Studio2013或更高版本)。

注意,您还应该检查名称或应用程序 ID。 如果你安装了office,你会得到两个或更多的OfflineInstallationIds。

检查名称包含 Windows 或检查 ApplicationID 等于 55c92734-d682-4d71-983e-d6ec3f16059f

PS:我不知道 Windows 的不同版本之间 AppliactionID 是否变化。我做了一些 Google 搜索,发现它似乎是一个静态值。