library winslip;
uses
System.SysUtils,
System.Classes,
Winapi.Windows;
{$R *.res}
/// <summary>
/// Es folgen Anweisungen für die Profüng auf Admin-Rechte, sowie die Lizenzierung
/// <p>
/// Administratorrolle (das Programm darf nur ausgeführt werden, sollte
/// der Nutzer der Administratorgruppe angehören);
/// </p>
/// <p>
/// Nutzer, die Schreibrechte in der Registry haben; und/oder in den Anwendsungsdaten
/// </p>
/// </summary>
function IsAdmin : Boolean;
const
SECURITY_NT_AUTHORITY : TSIDIdentifierAuthority =
( Value : ( 0, 0, 0, 0, 0, 5 ) );
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
var
hAccessToken : THandle;
ptgGroups : PTokenGroups;
dwInfoBufferSize : DWORD;
psidAdministrators : PSID;
x : Integer;
bSuccess : BOOL;
begin
Result := False;
bSuccess := False;
ptgGroups :=
nil;
psidAdministrators :=
nil;
try
bSuccess := OpenThreadToken(
GetCurrentThread,
TOKEN_QUERY,
True,
hAccessToken );
if not bSuccess
then
begin
if GetLastError = ERROR_NO_TOKEN
then
bSuccess := OpenProcessToken(
GetCurrentProcess,
TOKEN_QUERY,
hAccessToken );
end;
if bSuccess
then
begin
GetMem(
ptgGroups,
1024 );
bSuccess := GetTokenInformation(
hAccessToken,
TokenGroups,
ptgGroups,
1024,
dwInfoBufferSize );
if bSuccess
then
begin
AllocateAndInitializeSid(
SECURITY_NT_AUTHORITY,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,
0,
0,
0,
0,
0,
psidAdministrators );
{$R-}
for x := 0
to ptgGroups.GroupCount - 1
do
if EqualSid( psidAdministrators, ptgGroups.Groups[ x ].Sid )
then
begin
Result := True;
Break;
end;
{$R+}
end;
end;
finally
if bSuccess
then
CloseHandle( hAccessToken );
if Assigned( ptgGroups )
then
FreeMem( ptgGroups );
if Assigned( psidAdministrators )
then
FreeSid( psidAdministrators );
end;
end;
// ******************************************************
/// <summary>
/// Anweisungen für das Auslesen des PC-namens aus dem System
/// </summary>
function GetComputername :
string;
var
dwlength : DWORD;
begin
dwlength := 253;
SetLength(
Result,
dwlength + 1 );
if not Winapi.Windows.GetComputername( pchar( Result ), dwlength )
then
raise Exception.create( '
PC-Name konnte nicht ermittelt werden. ' );
Result := pchar( Result );
end;
/// <summary>
/// Umgebungsvariablen überprüfen
/// </summary>
/// <returns>
/// STRING/NSSTRING
/// </returns>
/// function ExpandEnvStr(const szInput: string): string;
function ExpandEnvStr(
const szInput :
string )
:
string;
const
MAXSIZE = 32768;
// laut PSDK sind 32k das Maximum
begin
SetLength(
Result,
MAXSIZE );
SetLength(
Result,
ExpandEnvironmentStrings( pchar( szInput ), @Result[ 1 ],
length( Result ) ) - 1 );
// -1 um abschließendes #0 zu verwerfen
end;
// **********************************************
// Funktionen exportieren ===> zur Verwendung
exports
GetComputername;
exports
IsAdmin;
exports
ExpandEnvStr;
begin
end.