背景
Windows 11 操作系統已經正式發布快有一年了,在 .Net 開發中,我們獲取操作系統版本,經常使用?Environment.OSVersion.Version.Major 和 Minor
(6.1 = Windows 7, 10.0 = Windows 10),但是當 Win11 出現以后,一切變的有些不一樣了。因為 Win11 獲取到的操作系統版本[1]?Major Minor 與 Win10 一樣。

在某些情況下因為不同的系統存在一些表現上的差別,我們需要區分操作系統的版本在編碼時進行不同的處理,所以正確的獲取操作系統版本非常重要,特別是 Win10 和 Win11 的變化還挺大的。
方案
其實劍走偏鋒,我們可以通過檢測某些軟件(win11做了某些系統軟件的刪減和增加)以及某些系統軟件的版本號來實現,但畢竟是偏門左道。
不過,經過多方查找和測試,我在?Stackoverflow[2]?找到一個相對來說靠譜的做法,Windows 10 從內部版本 10240 開始,以內部版本 19044 結束。Windows 11 從內部版本 22000 開始,那么:
Environment.OSVersion.Version.Build >= 22000;
通上面的代碼,在我們確定 Windows 操作系統之后就可以通過上面的代碼輕松判斷操作系統是否是 Win11 了。
后記
最后講一下尋找解決方案過程中忍不住吐槽的地方,你敢信我在測試一個通過注冊表讀取操作系統版本的方案最后 Win11 獲得結果產品名竟然是?Windows 10 Pro
??
而且這個操作系統是我前幾天才使用 Win11 的官方鏡像新裝的,還是從 Win11 的開發者預覽版新裝的穩定版。
string HKLMWinNTCurrent = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion";
string osName = Registry.GetValue(HKLMWinNTCurrent, "productName", "").ToString();

References
[1]
?操作系統版本:?https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/operating-system-version[2]
?Stackoverflow:?https://stackoverflow.com/questions/69038560/detect-windows-11-with-net-framework-or-windows-api