如何在不接收空字符串的情况下获取主板 ID?
Posted
技术标签:
【中文标题】如何在不接收空字符串的情况下获取主板 ID?【英文标题】:How to get motherboard ID without receiving empty strings? 【发布时间】:2013-07-29 09:52:42 【问题描述】:我尝试了很多东西:
//public static string GetMotherBoardID()
//
// string mbInfo = String.Empty;
// //Get motherboard's serial number
// ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_BaseBoard");
// foreach (ManagementObject mo in mbs.Get())
// mbInfo += mo["SerialNumber"].ToString();
// return mbInfo;
//
//public static string GetMotherBoardID()
//
// string mbInfo = String.Empty;
// ManagementScope scope = new ManagementScope("\\\\" + Environment.MachineName + "\\root\\cimv2");
// scope.Connect();
// ManagementObject wmiClass = new ManagementObject(scope, new ManagementPath("Win32_BaseBoard.Tag=\"Base Board\""), new ObjectGetOptions());
// foreach (PropertyData propData in wmiClass.Properties)
//
// if (propData.Name == "SerialNumber")
// mbInfo = String.Format("0,-251", propData.Name, Convert.ToString(propData.Value));
//
// return mbInfo;
//
public static string GetMotherBoardID()
string mbInfo = String.Empty;
ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_BaseBoard");
ManagementObjectCollection moc = mbs.Get();
ManagementObjectCollection.ManagementObjectEnumerator itr = moc.GetEnumerator();
itr.MoveNext();
mbInfo = itr.Current.Properties["SerialNumber"].Value.ToString();
var enumerator = itr.Current.Properties.GetEnumerator();
if (string.IsNullOrEmpty(mbInfo))
mbInfo = "0";
return mbInfo;
这在我的 PC 上给出了空字符串,但在笔记本电脑上给出了正确的 ID。 其他人也报告两台 PC 是空主板 ID。
结果:
public static string GetMotherBoardID()
string mbInfo = String.Empty;
ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_BaseBoard");
ManagementObjectCollection moc = mbs.Get();
ManagementObjectCollection.ManagementObjectEnumerator itr = moc.GetEnumerator();
itr.MoveNext();
mbInfo = itr.Current.Properties["SerialNumber"].Value.ToString();
var enumerator = itr.Current.Properties.GetEnumerator();
string properties = "";
while (enumerator.MoveNext())
properties += "[" + enumerator.Current.Name + "][" + (enumerator.Current.Value != null ? enumerator.Current.Value.ToString() : "NULL") + "]\n";
if (string.IsNullOrEmpty(mbInfo))
mbInfo = "0";
return mbInfo;
[Caption][Основная плата]
[ConfigOptions][NULL]
[CreationClassName][Win32_BaseBoard]
[Depth][NULL]
[Description][Основная плата]
[Height][NULL]
[HostingBoard][True]
[HotSwappable][False]
[InstallDate][NULL]
[Manufacturer][Gigabyte Technology Co., Ltd.]
[Model][NULL]
[Name][Основная плата]
[OtherIdentifyingInfo][NULL]
[PartNumber][NULL]
[PoweredOn][True]
[Product][H55M-S2H]
[Removable][False]
[Replaceable][True]
[RequirementsDescription][NULL]
[RequiresDaughterBoard][False]
[SerialNumber][ ]
[SKU][NULL]
[SlotLayout][NULL]
[SpecialRequirements][NULL]
[Status][OK]
[Tag][Base Board]
[Version][x.x]
[Weight][NULL]
[Width][NULL]
也许 c# 不适合检索这些东西? 我希望 C/C++ 上的解决方案或 C# 上的工作解决方案
【问题讨论】:
为什么不实际迭代从ManagementObjectCollection
获得的迭代器,看看其中是否有正确的值?现在,您只是获取集合中的第二个对象并将其转换为可能为空的字符串。它可能不是所有机器上集合的同一个条目。
我试过了,但那些真的是空的。好吧,从技术上讲,这是-“”
itr.MoveNext() 只工作一次。所以,有一个对象
你确定有一个有效的主板ID,我相信很多这些信息是由制造商决定的。在跳出深渊之前,我会尝试使用其他应用程序或方法进行验证。
【参考方案1】:
就个人而言,我建议使用这个特定的开源硬件监视器库(您需要源代码)。您可以将其用于硬件识别。 Open Hardware Monitor
【讨论】:
感谢您的回答,但我找不到此 prog 中显示的任何 ID【参考方案2】:有些主板根本没有 ID。它设置为空字符串。 因此,如果有人需要使用主板独有的东西来获得许可,他们应该收到主板 UUID。
【讨论】:
【参考方案3】:还有一个名为 DeviceID 的 NuGet 包。但是,您需要将他们的 DLL 包含在您的包中,但这是一个非常快速、简单的解决方案。
这里是一个用法示例:
/* Depends on https://www.nuget.org/packages/DeviceId/ Install-Package DeviceId - Version 5.2.0*/
/* Using AddMacAddress(true, true) to exclude both virtual and wireless network adapters. */
readonly string MachineSupportID = new DeviceIdBuilder()
.AddMacAddress(true, true)
.AddMotherboardSerialNumber()
.AddProcessorId()
.AddSystemDriveSerialNumber()
.ToString();
愿原力与你同在。
【讨论】:
以上是关于如何在不接收空字符串的情况下获取主板 ID?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 argv 的情况下获取字符串数组 - CS50 pset2
java - 在不知道模式的情况下从字符串中提取当前日期模式
如何在没有编译器警告的情况下返回对空字符串的 const 引用?
如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back