You might try using WMI, as follows:
using Microsoft.Win32;
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(@"\\.\root\cimv2",
"SELECT * FROM Win32_BIOS"));
foreach (var _object in searcher.Get())
{
if (_object != null)
{
try
{
string object_name = "?";
if (_object["Name"] != null)
{
object_name = _object["Name"].ToString();
}
else if (_object["Caption"] != null)
{
object_name = _object["Caption"].ToString();
}
else if (_object["Description"] != null)
{
object_name = _object["Description"].ToString();
}
foreach (var property in _object.Properties)
{
string property_name = property.Name;
if ((property.Value != null) &&
(!property_name.Contains("CreationClassName")))
{
string property_value;
if (!(property.Value is Array))
{
property_value = property.Value.ToString();
}
else
{
StringBuilder _property_value = new StringBuilder();
Array _property_array = property.Value as Array;
int count = 0;
foreach (var entry in _property_array)
{
if (count > 0) _property_value.Append(",\r\n");
_property_value.Append(entry.ToString());
count++;
}
property_value = _property_value.ToString();
}
}
}
}
catch (ManagementException exception)
{
System.Diagnostics.Trace.WriteLine(exception.ToString());
}
}
}
This logic shows how to enumerate most of the information available in WMI about the BIOS.