Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine Genuine Windows Installation in C#

Tags:

c#

.net

windows

wpf

If I wanted to determine if a user had a genuine copy of windows, how could I do that in C#? Can I integrate with Windows Genuine Advantage?

like image 861
Michael Avatar asked Oct 12 '09 02:10

Michael


2 Answers

You can use SLIsGenuineLocal (Checks whether the specified application is a genuine Windows installation), The Minimum supported client is Windows Vista.

The Software Licensing API , The Software Licensing API (SLAPI) can be used to determine a genuine Microsoft Windows installation, install and log an asset management license, and retrieve information about the licensing policy of a software component.

UPDATE, I Wrote this basic C# implementation

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();
    }
  }
}
like image 151
RRUZ Avatar answered Oct 22 '22 08:10

RRUZ


Update

When I answered this question, I was answering in the context of the asker's language (C#). As another answerer pointed out, there is a way to do this in other languages, but it's platform dependent (Vista and above, from what I can see).

Old answer (Clarified)

As far as I know, there is no API documentation available for WGA (still true), and since hackers could conceivably (and have) break WGA by knowing its internals, I doubt Microsoft is going to open up an API for WGA.

Microsoft has a separate API for C++ and COM developement as this answer points out, but nothing available in the .NET Framework that I can see.

Realistically, there's no good reason to find this out. It's not the business of the program to know if the OS is legally installed.

Edit

Leaving my answer up since I cannot delete it; but if you want to use Win32 API and don't have to stay inside the .NET Framework, I suggest using this answer.

like image 20
George Stocker Avatar answered Oct 22 '22 06:10

George Stocker