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

时间:2015-06-21 20:18:52

标签: c# windows installation

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

这可以通过命令行实现:

  

slmgr.vbs / dti

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

共有9个区块,每个区块有7个数字

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

2 个答案:

答案 0 :(得分:7)

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

需要声明这些名称空间:

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

使用using在代码文件的 top 中声明这些名称空间,如下所示:

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的'刷新'功能一次,我的WMI为我返回了两个离线安装ID,因此这应该是您需要考虑的事项(第一个离线安装ID是有效的 ):

enter image description here

你可能想要类似的东西:

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

如前所述,SoftwareLicensingProduct OfflineInstallationId仅适用于比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();

这样的事情:

enter image description here

除此之外,您还需要通过右键单击解决方案资源管理器中的引用,单击Add New Reference,然后添加{{1}来引用System.Management库。 }和System.Management到项目:

enter image description here

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

答案 1 :(得分:0)

注意,您还应该检查名称或应用程序ID。 如果安装了Office,则将获得两个或多个OfflineInstallationId。

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

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