2014-11-20 78 views
7

首先我想說謝謝你幫助我解決這個問題。我非常感謝你的時間和努力。Powershell WMI輸出不匹配c#WMI輸出

標題總結得非常好,但我會提供一些細節。基本上,如果我使用C#提取操作系統版本,它將返回6.2的結果,即使我的系統是8.1,應該返回6.3。經過我的研究,我發現這是System.Enviroment類中的一個有記錄的限制,...必須愛這些「功能」。

我已經找到了一種方法來處理這個問題,方法是進入reg並將我的6.2結果與HKLM \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion下的當前版本關鍵字進行比較,但這是一項非常冒險的操作,因爲reg info如有更改,恕不另行通知

當我試圖通過Powershell輪詢WMI時,這一切都變得很棘手。我不記得爲什麼我做了一個WMI搜索雖然PowerShell中,我猜它是感到好奇:)


C#代碼不只是貓:


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

Powershell代碼:


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

我曾經嘗試都x86和x64建立我的C#程序以及運行PowerShell的x86和x64的。差異沒有改變。

這給我提出了幾個問題,但最基本的是Powershell從哪裏得到正確的信息? Powershell是否像我原計劃修改其輸出一樣使用reg?由於我的構建目標.Net 3.5確實將Powershell拉到.Net 4.5(改變了我的構建,這沒有任何改變)。

從我的理解[System.Environment] :: OSVersion將信息與System.Environment.OSVersion相同。

Powershell如何工作和C#失敗?

:) 再次感謝!

+4

Windows中的版本檢查不斷髮展。顯然.Net OSVersion屬性返回Windows [GetVersionEx](http://technet.microsoft.com/en-us/windows/system.environment.osversion(v = vs.99).aspx)函數報告的版本。 根據[本文](http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx)「我們對GetVersion(Ex)API在Windows中的工作方式做了一些重大更改8.1由於過去使用GetVersion(Ex)API的方式導致客戶不良行爲。「該頁面上的詳細信息可幫助您將C#排序。 – 2014-11-20 21:06:53

回答

2

據我所知只有在C#程序中調用Environment.Version是不正確的(6.2)。在PowerShell中,它是正確的(6.3)。在通過PowerShell或C#調用的WMI中,它是正確的。實際上,使用Add-Type從PowerShell源代碼編譯的C#返回6.3。

查看文章here(感謝Booga Roo),它表明除非您的應用程序明確指出它通過清單文件指向Windows 8.1,否則您將獲得舊版本(6.2)。

你可以做一個C#應用程序通過添加應用程序清單文件,並取消註釋行

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

似乎可以假設的PowerShell微軟的作家有一個應用程序,宣佈8.1支持返回正確的版本與powershell一起顯示。聲明Windows 8.1支持的exe文件。