gpt4 book ai didi

c# - 聪明的。 C#中的硬盘数据

转载 作者:太空狗 更新时间:2023-10-30 00:33:58 27 4
gpt4 key购买 nike

只是尝试从我的应用程序将在其上运行的任何计算机上连接的硬盘驱动器中提取一些 SMART 信息。

我将 WMI 用于程序中的许多其他内容,我查看过的关于 SMART 的每个问题都引用了 Win32_DiskDrive。但是,此处的数据确实非常少,而且可能不够智能 - 我正在搜索“旋转重试计数”等信息。有任何想法吗?

最佳答案

您使用了错误的类(您需要 MSStorageDriver_ATAPISmartData)。要更改您想要更改的属性,请将 byte SpinRetryCount = 0x0A; 更改为您想要的任何值(例如,吞吐量性能为 0x02)

[StructLayout(LayoutKind.Sequential)]
public struct Attribute
{
public byte AttributeID;
public ushort Flags;
public byte Value;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] VendorData;
}

static void getSMARTAttr()
{
try
{
Attribute AtributeInfo;
ManagementScope Scope = new ManagementScope(String.Format("\\\\{0}\\root\\WMI", "localhost"), null);
Scope.Connect();
ObjectQuery Query = new ObjectQuery("SELECT VendorSpecific FROM MSStorageDriver_ATAPISmartData");
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
byte SpinRetryCount = 0x0A;
int Delta = 12;
foreach (ManagementObject WmiObject in Searcher.Get())
{
byte[] VendorSpecific = (byte[])WmiObject["VendorSpecific"];
for (int offset = 2; offset < VendorSpecific.Length; )
{
if (VendorSpecific[offset] == SpinRetryCount)
{

IntPtr buffer = IntPtr.Zero;
try
{
buffer = Marshal.AllocHGlobal(Delta);
Marshal.Copy(VendorSpecific, offset, buffer, Delta);
AtributeInfo = (Attribute)Marshal.PtrToStructure(buffer, typeof(Attribute));
Console.WriteLine("AttributeID {0}", AtributeInfo.AttributeID);
Console.WriteLine("Flags {0}", AtributeInfo.Flags);
Console.WriteLine("Value {0}", AtributeInfo.Value);
//if you want HEX values use this line
//Console.WriteLine("Value {0}", BitConverter.ToString(AtributeInfo.VendorData));
//if you want INT values use this line
Console.WriteLine("Data {0}", BitConverter.ToInt32(AtributeInfo.VendorData, 0));
}
finally
{
if (buffer != IntPtr.Zero)
{
Marshal.FreeHGlobal(buffer);
}
}
}
offset += Delta;
}
}
}
catch (Exception e)
{
Console.WriteLine(String.Format("Exception {0} Trace {1}", e.Message, e.StackTrace));
}
Console.WriteLine("Press Enter to exit");
Console.Read();
}

请记住,如果您得到的不是 0,则需要购买新硬盘!此代码还需要 UAC 提升,因此您需要以管理员身份运行该应用程序,否则您将遇到异常。

关于c# - 聪明的。 C#中的硬盘数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9352017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com