簡體   English   中英

在C#中確定正版Windows安裝

[英]Determine Genuine Windows Installation in C#

如果我想確定用戶是否有正版的Windows副本,我怎么能在C#中做到這一點? 我可以與Windows Genuine Advantage集成嗎?

您可以使用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();
    }
  }
}

更新

當我回答這個問題時,我在提問者語言(C#)的背景下回答。 正如另一位回答者指出的那樣,有一種方法可以在其他語言中實現,但它依賴於平台(Vista及以上,我可以看到)。

舊答案(澄清)

據我所知,沒有可用於WGA的API文檔(仍然如此),並且由於黑客可以想象(並且已經)通過了解其內部結構來打破WGA,我懷疑微軟是否會為WGA打開一個API。

微軟有一個單獨的C ++和COM開發API,正如這個答案所指出的那樣,但我在.NET Framework中看不到任何東西。

實際上,找到這個沒有充分的理由。 知道操作系統是否合法安裝不是程序的業務。

編輯

因為我無法刪除它,所以我的答案就行了; 但是如果你想使用Win32 API並且不必留在.NET Framework中,我建議使用這個答案

暫無
暫無

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

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