簡體   English   中英

查找Windows是否是沒有WMI的OEM

[英]Find if Windows is OEM without WMI

它可以使用WMI完成。

但有一種簡單的方法(類似於Environment.Is64BitOperatingSystem )?

編輯:WMI有權限限制。 據我所知, Is64BitOperatingSystem在這方面要好得多,也許還有其他人。 (如果我錯了,請糾正我。)

我正在努力確保代碼始終運行,而不會拋出異常。

好吧,首先, Environment.Is64BitOperatingSystem能夠完成其工作而不需要任何特殊權限,因為它實際上不會進行任何檢查。 64位版本的.NET Framework硬編碼返回true,32位版本返回false。 就那么簡單。

不幸的是,對於您希望獲得的信息,事情會變得復雜一些。

您沒有說明如何通過WMI獲取此信息,但我假設您正在查詢Win32_OperatingSystem類的SerialNumber屬性,然后獲取您已了解的有關Windows產品ID格式的信息以確定操作系統是否存在是使用OEM密鑰安裝的。 如果有一個OEM作為該密鑰的第二部分,則返回true,否則返回false。

當然,密鑰的該部分也可以是數字,某些數值表示OEM密鑰。 例如,我記得600s中的某些值表示OEM密鑰,但我無法准確地告訴您哪些。 希望你有一個所有這些的主列表(從哪里,我想知道?),並正在檢查它們。 否則,你會得到一些漏報。

無論如何,假設這是你的方法(而且這是我能想到的唯一方法),問題就變成了“如何在不使用WMI的情況下獲取Windows產品ID?”

您可以嘗試查詢注冊表,但這是一種脆弱的方法。 它沒有記錄在注冊表中的某個位置,因此這可能會在Windows版本之間發生變化。 在當前版本中,它在

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId

為了使其工作,您還必須正確處理32位與64位,並且您的應用程序將需要僅提升管理員可以使用HKEY_LOCAL_MACHINE

據我所知,Win32 API沒有公開此信息。 當然沒有IsOEMVersion函數,它既不是OSVERSIONINFOEX結構的成員之一,也不是IsOS函數使用的標志之一。

顯然,WMI存在的原因。 如果它能滿足您的需求,那么您應該使用它。 關於它沒有任何內在的“不安全”。 如果您要查詢的信息需要某些特權才能訪問,那么它確實存在,並且您不會在尋找繞過這些安全限制的替代訪問路徑方面取得很大成功。

如果絕對有必要使用部分受信任的代碼來利用WMI的強大功能,則可以創建一個中間完全受信任的程序集,該程序集公開必要的功能,然后從部分受信任的程序集中調用它。

但在這種特殊情況下,您應該認真地質疑為什么需要或想要這些信息。 如果它是操作系統的OEM版本,它會有什么不同? 它的行為與您的觀點完全相同(作為用戶和開發人員)。 如果您向我們提供了有關您計划使用此信息的更多信息,我們可能會提供一些更好的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM