如果我想确定一个用户是否拥有一个真正的Windows副本,那么我怎样才能在C#中做到这一点? 我可以与Windows Genuine Advantage集成吗?
当我回答这个问题时,我正在回答提问者的语言(C#)。 正如另一位回答者指出的,有一种方法可以在其他语言中实现,但是依赖于平台(Vista和更高版本,从我所能看到的)。
据我所知,没有API文档可用于WGA(依然如此),而且由于黑客可以通过了解其内部知识来破解WGA,所以我怀疑微软是否会为WGA开放一个API。
微软有一个单独的C + +和COM开发的API,因为这个答案指出,但我没有看到。
实际上,没有很好的理由去找出答案。 知道该操作系统是否合法安装并不是该程序的业务。
离开我的答案,因为我不能删除它; 但是如果你想使用Win32 API
而不必停留在.NET Framework中,我建议使用这个答案 。
您可以使用SLIsGenuineLocal (检查指定的应用程序是否是正版Windows安装),最低支持的客户端是Windows Vista。
软件许可API ,软件许可API(SLAPI)可用于确定正版Microsoft Windows安装,安装和记录资产管理许可证,并检索有关软件组件授权策略的信息。
更新 ,我写了这个基本的C#实现
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication11 { using SLID = Guid; //SLID id declarated as typedef GUID SLID; in slpublic.h class Program { public enum SL_GENUINE_STATE { SL_GEN_STATE_IS_GENUINE = 0, SL_GEN_STATE_INVALID_LICENSE = 1, SL_GEN_STATE_TAMPERED = 2, SL_GEN_STATE_LAST = 3 } [DllImportAttribute("Slwga.dll", EntryPoint = "SLIsGenuineLocal", CharSet = CharSet.None, ExactSpelling = false, SetLastError = false, PreserveSig = true, CallingConvention = CallingConvention.Winapi, BestFitMapping = false, ThrowOnUnmappableChar = false)] [PreserveSigAttribute()] internal static extern uint SLIsGenuineLocal(ref SLID slid, [In, Out] ref SL_GENUINE_STATE genuineState, IntPtr val3); public static bool IsGenuineWindows() { bool _IsGenuineWindows = false; Guid ApplicationID = new Guid("55c92734-d682-4d71-983e-d6ec3f16059f"); //Application ID GUID http://technet.microsoft.com/en-us/library/dd772270.aspx SLID windowsSlid = (Guid)ApplicationID; try { SL_GENUINE_STATE genuineState = SL_GENUINE_STATE.SL_GEN_STATE_LAST; uint ResultInt = SLIsGenuineLocal(ref windowsSlid, ref genuineState, IntPtr.Zero); if (ResultInt == 0) { _IsGenuineWindows = (genuineState == SL_GENUINE_STATE.SL_GEN_STATE_IS_GENUINE); } else { Console.WriteLine("Error getting information {0}", ResultInt.ToString()); } } catch (Exception ex) { Console.WriteLine(ex.Message); } return _IsGenuineWindows; } static void Main(string[] args) { if (Environment.OSVersion.Version.Major >= 6) //Version 6 can be Windows Vista, Windows server 2008, or Windows 7 { if (IsGenuineWindows()) { Console.WriteLine("Original Windows"); } else { Console.WriteLine("Not Original Windows"); } } else { Console.WriteLine("OS Not supoprted"); } Console.ReadLine(); } } }