Mic*_*ael 8 .net c# windows wpf
如果我想确定用户是否有正版的Windows副本,我怎么能在C#中做到这一点?我可以与Windows Genuine Advantage集成吗?
RRU*_*RUZ 18
您可以使用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_OFFLINE = 3,
SL_GEN_STATE_LAST = 4
}
[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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我回答这个问题时,我是在提问者的语言(C#)的上下文中回答的。正如另一位回答者指出的那样,有一种方法可以用其他语言来做到这一点,但它依赖于平台(Vista 及更高版本,据我所知)。
据我所知,WGA 没有可用的 API 文档(仍然如此),并且由于黑客可以通过了解 WGA 的内部结构来破坏 WGA,所以我怀疑 Microsoft 是否会开放 WGA 的 API。
正如这个答案指出的那样,Microsoft 有一个单独的用于 C++ 和 COM 开发的 API ,但我在 .NET Framework 中看不到任何可用的内容。
事实上,没有充分的理由去发现这一点。程序不关心操作系统是否合法安装。
留下我的答案,因为我无法删除它;但如果您想使用Win32 API
并且不必留在 .NET Framework 中,我建议使用此答案。
归档时间: |
|
查看次数: |
3195 次 |
最近记录: |