2012-05-11 114 views
0

的綱領性識別我有需要識別安裝在PC上的Windows版本的一些獨立的C++代碼(即不是Windows程序)。出帶外的Windows Server VS客戶端

我可以根據內核版本輕鬆區分不同的Windows客戶端版本(例如ntoskrnl.exe上的GetFileVersionInfo),但是我想知道是否有可靠的方法來區分客戶端和服務器安裝。

使用此方法區分Windows Vista SP2和Windows Server 2008 SP2(它們都是6.0 build 6002)以及Windows 7和Windows Server 2008 R2(6.1版本生成RTM版本和6.1生成版本7601)時出現問題SP2,兩者)。什麼是可靠的(並且最好儘可能直截了當,避免註冊表會很好,因爲訪問Win32 API不可用)爲環境外代碼正確識別客戶端與服務器操作系統的方法?

我想我可以檢查只存在於服務器版上的文件(無論配置如何,保證在任何服務器版本上安裝的文件都是好的),檢查Panther文件夾(安全刪除,所以不可以保證)等,但我相信這是一個人們遇到的問題,並希望更好地解決問題?

(旁註:這個問題已經被問on SO before,但解決方案(WMI)不適用於出帶外檢查)

+0

出於純粹的好奇心,你爲什麼需要這樣做?我一直在琢磨幾個小時,想不到一個用例... –

+0

這是鎖定或解鎖恢復軟件的某些功能。 –

回答

0

我結束了尋找一些在system32目錄下,其通常與Windows的服務器版相關的二進制文件。它不是很乾淨,但實際上它運行得非常好。

0

我不完全相信你的意思帶外檢查什麼,所以我暫時忽略這一點。

正常的方法是撥打GetVersionEx,並查看OSVERSIONINFOEXwProductType成員。

+0

我在帖子中指出「帶外」意味着我不在* Windows中,並且我無法訪問Windows API。將看看'wProductType',看看我是否可以從'ntoskrnl.exe'中的PE頭獲取它。 –

+0

你知道'GetVersionEx'獲得'OSVERSIONINFOEX'嗎?我無法在ntoskrnl.exe的PE對象頭文件中找到任何內容:http://pastebin.com/DTADp2EV –

+0

@ MahmoudAl-Qudsi:我很確定它從註冊表中檢索數據。有(或曾經是)黑客讓工作站更像服務器(允許更多的客戶端連接等),通過修改註冊表來認爲它是服務器的副本;二進制文件本身至少用於相同。不過不知道這是否是真的(它在NT4/Win2K時間框架內變得突出)。 –

0

的PE映像不指定圖像是否應該在客戶端或服務器上運行。它僅規定了關於子系統的依賴,內存,親和力等方面的運行要求...

+0

謝謝,但這不是我的問題的答案..你的意思是發表這個評論? –

+0

對不起,是的,這是一條評論。 :-) – mox

+0

僅供參考,您可以通過點擊您的答案下的鏈接將其刪除並重新發布爲評論。而且,順便說一句,PE頭包含子系統信息,並且可以從二進制文件中提取依賴關係信息。您可以在此鏈接中看到子系統信息:http://pastebin.com/DTADp2EV –