C# 获取脱机安装ID(Windows 8或类似版本)

C# 获取脱机安装ID(Windows 8或类似版本),c#,windows,installation,C#,Windows,Installation,是否可以获取Windows脱机安装ID(OfflineInstallationId在slmgr.vbs中找到) 这可以通过以下命令行实现: slmgr.vbs/dti 这将返回不带空格或破折号的安装ID,是否可以在C#中检索此ID? 我希望最终将ID的每个块(有9个块,每个块中有7个数字)放在表单上它们自己的文本框中 共有9个区块,每个区块有7个编号 我环顾四周,但找不到任何C#的示例。这可以通过查询WMI(Windows Management Instrumentation)的Win32_Wi

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

这可以通过以下命令行实现:

slmgr.vbs/dti

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

共有9个区块,每个区块有7个编号


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

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

需要声明以下命名空间:

  • 系统
  • System.Collections.Generic
  • 系统管理
  • 系统文本
使用
声明代码文件顶部的那些名称空间,如下所示:

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是<强>有效的一个/强>):

您可能需要类似的内容:

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
with
OfflineInstallationId
仅适用于比Vista更新的Windows版本(例如,Vista、7、8、8.1和10),因此,如果您(或您程序的用户)希望在XP或更早版本上使用它,您可以使用以下选项:,但是,由于我无法访问XP,因此无法测试:

ObjectQuery Query = new ObjectQuery("SELECT GetInstallationID FROM Win32_WindowsProductActivation");
如果要分离ID的每个块并将其插入到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();
string installId=getOfflineInstallId();
StringBuilder sb=新的StringBuilder();
bool-fRun=false;
对于(int i=0;i
大概是这样的:

此外,您还需要通过右键单击解决方案资源管理器中的引用,单击
添加新引用
,并将
系统管理
系统管理
添加到项目中,来引用系统管理库:


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

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

需要声明以下命名空间:

  • 系统
  • System.Collections.Generic
  • 系统管理
  • 系统文本
使用
声明代码文件顶部的那些名称空间,如下所示:

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是<强>有效的一个/强>):

您可能需要类似的内容:

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
with
OfflineInstallationId
仅适用于比Vista更新的Windows版本(例如,Vista、7、8、8.1和10),因此,如果您(或您程序的用户)希望在XP或更早版本上使用它,您可以使用以下选项:,但是,由于我无法访问XP,因此无法测试:

ObjectQuery Query = new ObjectQuery("SELECT GetInstallationID FROM Win32_WindowsProductActivation");
如果要分离ID的每个块并将其插入到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();
string installId=getOfflineInstallId();
StringBuilder sb=新的StringBuilder();
bool-fRun=false;
对于(int i=0;i
大概是这样的:

此外,您还需要通过右键单击解决方案资源管理器中的引用,单击
添加新引用
,并将
系统管理
系统管理
添加到项目中,来引用系统管理库:


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

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

检查名称是否包含
Windows
或检查应用程序ID是否等于
55c92734-d682-4d71-983e-d6ec3f16059f


PS:我不知道应用程序ID在不同版本的Windows之间是否有变化。我在谷歌上搜索了一下,发现它似乎是一个静态值。

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

检查名称是否包含
Windows
或检查应用程序ID是否等于
55c92734-d682-4d71-983e-d6ec3f16059f


PS:我不知道应用程序ID在不同版本的Windows之间是否有变化。我在谷歌上搜索了一下,发现它似乎是一个静态值。

谢谢你的代码,但我站在地铁上。你能不能帮我简化一下代码?我想将此作为Windows窗体:-)非常抱歉,