2012-02-19 2 views
4

내 응용 프로그램이 실행될 컴퓨터의 연결된 하드 드라이브에서 일부 스마트 정보를 가져 오려고합니다.S.M.A.R.T. C#의 하드 드라이브 데이터

나는 프로그램에서 많은 다른 것들을 위해 WMI를 사용하고 있으며, 내가 보았던 SMART에 대한 모든 질문은 Win32_DiskDrive를 참조한다. 그러나 여기에있는 데이터는 실제로 아주 작고 스마트하지 않을 수도 있습니다. 'Spin Retry Count'와 같은 정보를 찾고 있습니다. 어떤 아이디어?

+0

다음은 답변입니다. http://blogs.msdn.com/b/clemensv/archive/2011/04/11/reading-atapi-smart-data-from-drives-using-net-temperature-anyone. aspx – Kamil

+0

잘못된 수업을 검색하고 있습니다. MSStorageDriver_ATAPISmartData 클래스를 찾아서 읽습니다. 자세한 내용은 Google MSStorageDriver_ATAPISmartData를 참조하십시오. – Kamil

+0

@CJxD MSStorageDriver_ATAPISmartData 클래스에 액세스하여 deta를 선택하고 올바른 바이트를 올바른 구조 (바이트, 사용자 지정, int 등)에 매핑해야합니다. –

답변

8

잘못된 클래스를 사용하고 있습니다 (MSStorageDriver_ATAPISmartData를 원함). 당신이 (예를 들어, 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 이외의 것을 얻을 경우, 새 하드 드라이브를 구입해야한다는 것을 기억 어떤 값 byte SpinRetryCount = 0x0A;을 변경하려는 속성 무엇 변경하려면! 또한이 코드는 UAC 권한 상승이 필요하므로 관리자 권한으로 응용 프로그램을 실행해야합니다. 그렇지 않으면 예외가 발생합니다.