Starting with Windows Vista , Microsoft introduces the The Software Licensing API (SLAPI), this API can be used to determine a genuine Microsoft Windows installation.
So using the SLIsGenuineLocal function you can check if your app is running in a genuine Windows installation.
This is the definition of the function
HRESULT WINAPI SLIsGenuineLocal( __in const SLID *pAppId, __out SL_GENUINE_STATE *pGenuineState, __inout_opt SL_NONGENUINE_UI_OPTIONS *pUIOptions );
The use of this funtion is very easy, only you must pass the GUID (Application Id) of Windows {55c92734-d682-4d71-983e-d6ec3f16059f} and a variable of type SL_GENUINE_STATE to receive the status of the license.
Check this delphi implementation
{$APPTYPE CONSOLE} uses Windows, SysUtils; type SLID = TGUID; _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 ); SL_GENUINE_STATE = _SL_GENUINE_STATE; function SLIsGenuineLocal(var pAppId: SLID; var pGenuineState: SL_GENUINE_STATE; pUIOptions: Pointer): HRESULT; stdcall; external 'Slwga.dll' name 'SLIsGenuineLocal' delayed; Var pAppId : SLID; pGenuineState: SL_GENUINE_STATE; Status: HRESULT; begin try if Win32MajorVersion>= 6 then //Windows Vista o newer begin pAppId:=StringToGUID('{55C92734-D682-4D71-983E-D6EC3F16059F}'); Status:=SLIsGenuineLocal(pAppId, pGenuineState,nil); if Succeeded(Status) then case pGenuineState of SL_GEN_STATE_IS_GENUINE : Writeln('The installation is genuine.'); SL_GEN_STATE_INVALID_LICENSE : Writeln('The application does not have a valid license.'); SL_GEN_STATE_TAMPERED : Writeln('The Tampered flag of the license associated with the application is set.'); SL_GEN_STATE_LAST : Writeln('The state of the installation has not changed since the last time it was checked.'); end else Writeln(SysErrorMessage(Cardinal(Status))); end else Writeln('OS not supported'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end.
In windows XP does not exist the SLAPI, but you can use the Win32_WindowsProductActivation WMI class to get simmilar information. the key is check the ActivationRequired property, If return 1 then the system activation is pending for the system. else If returns 0 (zero) the activation is not required.
{$APPTYPE CONSOLE} uses SysUtils, ActiveX, ComObj, Variants; procedure GetWin32_WindowsProductActivationInfo; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; if (Win32MajorVersion=5) and (Win32MinorVersion=1) then begin NullStrictConvert :=False; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_WindowsProductActivation','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Windows is Activated %s',[BooltoStr(FWbemObject.ActivationRequired=0,True)])); Writeln(Format('ActivationRequired %d',[Integer(FWbemObject.ActivationRequired)])); Writeln(Format('Description %s',[String(FWbemObject.Description)])); Writeln(Format('ProductID %s',[String(FWbemObject.ProductID)])); if FWbemObject.ActivationRequired=1 then begin Writeln(Format('RemainingEvaluationPeriod %d',[Integer(FWbemObject.RemainingEvaluationPeriod)])); Writeln(Format('RemainingGracePeriod %d',[Integer(FWbemObject.RemainingGracePeriod)])); end; Writeln(Format('ServerName %s',[String(FWbemObject.ServerName)])); Writeln(Format('SettingID %s',[String(FWbemObject.SettingID)])); Writeln; FWbemObject:=Unassigned; end; end else Writeln('OS not supported'); end; begin try CoInitialize(nil); try GetWin32_WindowsProductActivationInfo; finally CoUninitialize; end; except on E:EOleException do Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end.
July 28, 2012 at 3:14 am
The WinXP method reports a system as being in the evaluation period if activation hasn’t been performed, but the Vista/W7 method does not. It reports the system as Genuine regardless of being in the evaluation period. Do you know of any way to find this information using a similar method?
August 8, 2012 at 10:21 pm
Sorry, I Don’t know another method to get that info.
January 31, 2015 at 6:56 am
This checks if Window$ is genuine, not activated. Not activated Window$ is always genuine (legal). Methods are working for all XP+. But you touch another problem: how to check if Window$ is activated or not (and how many days remaining?)? In KMS related tools are nice scripts to do it, but I don’t know how to do it in Delphi :(