C# 获取脱机安装ID(Windows 8或类似版本)
是否可以获取Windows脱机安装ID(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
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
withOfflineInstallationId
仅适用于比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
withOfflineInstallationId
仅适用于比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窗体:-)非常抱歉,