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 :(