2014-11-20 16 views
7

Innanzitutto vorrei ringraziare per avermi aiutato con questo problema. Apprezzo molto il tuo tempo e i tuoi sforzi.L'output WMI di Powershell non corrisponde all'uscita WMI C#

Il titolo lo riassume piuttosto bene, ma fornirò alcuni dettagli. Fondamentalmente se tiro la mia versione del sistema operativo usando C# restituisce il risultato 6.2 che è per Windows 8 anche se il mio sistema è 8.1 che dovrebbe restituire 6.3. Dopo la mia ricerca ho scoperto che si trattava di una limitazione documentata all'interno della classe System.Enviroment, ... devo amare quelle "caratteristiche".

ho trovato un modo per affrontare questo andando nella reg e confrontando il mio 6.2 risultato con l'attuale chiave di versione in HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion Tuttavia, questa è un'operazione molto rischiosa come informazioni reg potrebbe cambiare senza preavviso.

Tutto mi ha incasinato quando ho provato a interrogare WMI tramite Powershell. Non riesco a ricordare il motivo per cui ho fatto una ricerca WMI però PowerShell, credo che la sua non solo i gatti che ottengono curioso :)


C# Codice:


string version = Environment.OSVersion.ToString(); 
MessageBox.Show(version); 
//Output "Microsoft Windows NT 6.2.9200.0" 

Powershell Codice:


[System.Environment]::OSVersion | Select-Object -Property VersionString 
//OUtput "Microsoft Windows NT 6.3.9600.0" 

Ho provato sia x86 e x64 costruisce del mio programma C# oltre a gestire il PowerShell sia x86 e x64. Le discrepanze non sono cambiate.

Questo solleva diverse domande per me, ma quello di base è da dove Powershell ottiene le informazioni corrette da? Powershell usa il reg come avevo programmato di correggere il suo output? Dal momento che i miei obiettivi di compilazione .Net 3.5 sono Powershell .Net 4.5 (modificato la mia build e questo non ha cambiato nulla).

Dalla mia comprensione [System.Environment] :: OSVersion richiama le informazioni come System.Environment.OSVersion.

Come diavolo funziona Powershell e C# non riesce ??

:) Grazie ancora!

+4

Il controllo della versione in Windows continua a evolversi. Apparentemente la proprietà. Net OSVersion restituisce la versione riportata dalla funzione Windows [GetVersionEx] (http://technet.microsoft.com/en-us/windows/system.environment.osversion (v = vs.99) .aspx). In base a [questo articolo] (http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx) "Abbiamo apportato alcune modifiche significative al funzionamento delle API GetVersion (Ex) in Windows 8.1 a causa di comportamenti indesiderati del cliente derivanti dal modo in cui le API GetVersion (Ex) sono state utilizzate in passato. "I dettagli su quella pagina possono aiutare a ordinare il C# out. –

risposta

2

Per quanto ne so, solo la chiamata Environment.Version in un programma C# è errata (6.2). In PowerShell è corretto (6.3). In WMI chiamato tramite PowerShell o C# è corretto. Infatti, C# compilato dall'origine in PowerShell utilizzando Add-Type restituisce 6.3.

Guardando nell'articolo here (grazie Booga Roo) indica che, a meno che l'applicazione specificatamente non indichi come target Windows 8.1 tramite un file manifest, si ottiene la versione precedente (6.2).

È possibile effettuare un'applicazione C# restituisce la versione corretta con l'aggiunta di un file manifesto dell'applicazione e dichiarando 8.1 sostegno decommentando linea

<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 

Sembra lecito ritenere che gli scrittori di PowerShell di Microsoft inclusi un'applicazione manifestare con powershell.exe che dichiara il supporto di Windows 8.1.