2009-01-26 10 views
10

Estoy buscando recuperar la calificación de experiencia de Windows de una máquina en C#. Si es posible, también me gustaría recuperar los números para cada componente (Gráficos, RAM, etc.)Recuperar Windows Experience Rating

¿Esto es posible?

Respuesta

7

Cada vez que el usuario a través del panel de control para calcular la experiencia Clasificación de Windows, el sistema crea un nuevo archivo en %Windows%\Performance\WinSAT\DataStore\

Es necesario encontrar el archivo más reciente (que se nombran con la fecha más significativo en primer lugar, así que encontrar el último archivo es trivial).

Estos archivos son xml y son fáciles de analizar con XmlReader u otro analizador xml.

La sección que te interesa es WinSAT\WinSPR y contiene todas las puntuaciones en una sola sección. P.ej.

<WinSAT> 
    <WinSPR> 
     <SystemScore>3.7</SystemScore> 
     <MemoryScore>5.9</MemoryScore> 
     <CpuScore>5.2</CpuScore> 
     <CPUSubAggScore>5.1</CPUSubAggScore> 
     <VideoEncodeScore>5.3</VideoEncodeScore> 
     <GraphicsScore>3.9</GraphicsScore> 
     <GamingScore>3.7</GamingScore> 
     <DiskScore>5.2</DiskScore> 
    </WinSPR> 
... 
+0

Como Microsoft eliminó la página de la experiencia en Windows desde el Panel de control de Windows 8 en adelante, primero tendrá que generar un nuevo archivo en el almacén de datos. Consulte aquí para obtener más información: http://www.hanselman.com/blog/CalculateYourWEIWindowsExperienceIndexUnderWindows81.aspx – Surfbutler

1

Here es un fragmento para VB.NET. Convertido a C# (usando this, todavía no he probado el código, aunque parece estar bien).

/// <summary> 
/// Gets the base score of a computer running Windows Vista or higher. 
/// </summary> 
/// <returns>The String Representation of Score, or False.</returns> 
/// <remarks></remarks> 
public string GetBaseScore() 
{ 
    // Check if the computer has a \WinSAT dir. 
    if (System.IO.Directory.Exists("C:\\Windows\\Performance\\WinSAT\\DataStore")) 
    { 
     // Our method to get the most recently updated score. 
     // Because the program makes a new XML file on every update of the score, 
     // we need to calculate the most recent, just incase the owner has upgraded. 
     System.IO.DirectoryInfo Dir = new System.IO.DirectoryInfo("C:\\Windows\\Performance\\WinSAT\\DataStore"); 
     System.IO.FileInfo[] fileDir = null; 
     System.IO.FileInfo fileMostRecent = default(IO.FileInfo); 
     System.DateTime LastAccessTime = default(System.DateTime); 
     string LastAccessPath = string.Empty; 
     fileDir = Dir.GetFiles; 

     // Loop through the files in the \WinSAT dir to find the newest one. 
     foreach (var fileMostRecent in fileDir) 
     { 
      if (fileMostRecent.LastAccessTime >= LastAccessTime) 
      { 
       LastAccessTime = fileMostRecent.LastAccessTime; 
       LastAccessPath = fileMostRecent.FullName; 
      } 
     } 

     // Create an XmlTextReader instance. 
     System.Xml.XmlTextReader xmlReadScore = new System.Xml.XmlTextReader(LastAccessPath); 

     // Disable whitespace handling so we don't read over them 
     xmlReadScore.WhitespaceHandling = System.Xml.WhitespaceHandling.None; 

     // We need to get to the 25th tag, "WinSPR". 
     for (int i = 0; i <= 26; i++) 
     { 
      xmlReadScore.Read(); 
     } 

     // Create a string variable, so we can clean up without any mishaps. 
     string SystemScore = xmlReadScore.ReadElementString("SystemScore"); 

     // Clean up. 
     xmlReadScore.Close(); 

     return SystemScore; 
    } 

    // Unsuccessful. 
    return false; 
} 

Supongo que solo devuelve la calificación general, pero espero que al menos debería comenzar. Puede ser solo una cuestión de cambiar un nombre de archivo/parámetro para obtener las calificaciones individuales.

4

mismo con LINQ:

var dirName = Environment.ExpandEnvironmentVariables(@"%WinDir%\Performance\WinSAT\DataStore\"); 
var dirInfo = new DirectoryInfo(dirName); 
var file = dirInfo.EnumerateFileSystemInfos("*Formal.Assessment*.xml") 
    .OrderByDescending(fi => fi.LastWriteTime) 
    .FirstOrDefault(); 

if (file == null) 
    throw new FileNotFoundException("WEI assessment xml not found"); 

var doc = XDocument.Load(file.FullName); 

Console.WriteLine("Processor: " + doc.Descendants("CpuScore").First().Value); 
Console.WriteLine("Memory (RAM): " + doc.Descendants("MemoryScore").First().Value); 
Console.WriteLine("Graphics: " + doc.Descendants("GraphicsScore").First().Value); 
Console.WriteLine("Gaming graphics: " + doc.Descendants("GamingScore").First().Value); 
Console.WriteLine("Primary hard disk: " + doc.Descendants("DiskScore").First().Value); 
Console.WriteLine("Base score: " + doc.Descendants("SystemScore").First().Value); 
Cuestiones relacionadas