获取脱机安装ID(Windows 8或类似)

use*_*690 0 c# windows installation

是否可以获取Windows脱机安装ID(OfflineInstallationId在slmgr.vbs中找到)?

这可以在命令行中实现:

slmgr.vbs/dti

这将返回没有空格或破折号的安装ID,是否可以在C#中检索它?我希望最终在表单上的每个文本框中都有ID的每个块(每个块中有9个块,7个数字).

共有9个街区,每个街区有7个街区

我环顾四周,但找不到任何C#的例子.

ASt*_*her 6

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

需要声明这些名称空间:

  • 系统
  • System.Collections.Generic
  • 系统管理
  • System.Text

声明这些命名空间的顶部与你的CodeFile的using,因为本身:

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;
Run Code Online (Sandbox Code Playgroud)

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

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.   
}
Run Code Online (Sandbox Code Playgroud)

我注意到,因为我使用了Windows 8.1的'刷新'功能一次,我的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.
}
Run Code Online (Sandbox Code Playgroud)

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

ObjectQuery Query = new ObjectQuery("SELECT GetInstallationID FROM Win32_WindowsProductActivation");
Run Code Online (Sandbox Code Playgroud)

如果要分隔ID的每个块并插入到TextBoxWindows窗体(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();
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

在此输入图像描述

继此,您还需要参考右键单击System.Management库上引用在Solution Explorer中,点击Add New Reference,并添加System.ManagementSystem.Management.Instrumentation到项目:

在此输入图像描述

此示例中使用的项目可以在此处下载(需要Visual Studio 2013或更高版本).