Как получить идентификатор материнской платы без получения пустых строк?

Я перепробовал много вещей:

//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,-25}{1}", 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;
}

Это все дает пустую строку на моем ПК, но правильный идентификатор на ноутбуке.
Другой человек, также сообщающий о двух компьютерах, является пустым идентификатором материнской платы.

Результат:

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 #

1

Решение

Лично я бы рекомендовал использовать именно эту библиотеку аппаратного монитора с открытым исходным кодом (вам понадобится исходный код). Вы можете использовать его для идентификации оборудования. Открытый аппаратный монитор

1

Другие решения

Некоторые материнские платы просто не имеют идентификатора. Он установлен на пустую строку.
Таким образом, если кому-то нужно использовать уникальную материнскую плату для лицензирования, он должен получить UUID материнской платы.

1

По вопросам рекламы [email protected]