Also ich würde so vorgehen,
zu Frage 1: Die Systemsid ermitteln
Delphi-Quellcode:
function ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR): Boolean; stdcall;
external 'advapi32.dll' name 'ConvertSidToStringSidA';
function GetAccountSid(const Server, User: WideString; var Sid: PSID): DWORD;
var
dwDomainSize, dwSidSize: DWord;
R: LongBool;
wDomain: WideString;
Use: DWord;
begin
Result := 0;
SetLastError(0);
dwSidSize := 0;
dwDomainSize := 0;
R := LookupAccountNameW(PWideChar(Server), PWideChar(User), nil, dwSidSize, nil, dwDomainSize, Use);
if (not R) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
SetLength(wDomain, dwDomainSize);
Sid := GetMemory(dwSidSize);
R := LookupAccountNameW(PWideChar(Server), PWideChar(User), Sid, dwSidSize, PWideChar(wDomain), dwDomainSize, Use);
if not R then
begin
FreeMemory(Sid);
Sid := nil;
end;
end
else
Result := GetLastError;
end;
function GetSystemSID: string;
var
SID: PSID;
strSID: PChar;
CName: array[0..255] of Char;
nSize: Cardinal;
begin
Result := '';
GetComputerName(CName, nSize);
if GetAccountSid('', CName, SID) = 0 then begin
ConvertSidToStringSid(SID, strSID);
Result := strSid;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Add('System SID:'+GetSystemSID);
end;
Zu Frage 2:
Eine Möglichkeit wäre einen CRC32 ( in uses crc32 aufnehmen ) aus dieser Sid zu erstellen zb.
Delphi-Quellcode:
function CheckSum(Sid: string): string;
var
CRC32: DWORD;
STemp: string;
SS: string;
begin
STemp := '';
ss := '';
ss := Sid;
CRC32 := $FFFFFFFF;
if LENGTH(ss) > 0
then CalcCRC32(Addr(ss[1]), LENGTH(ss), CRC32);
STemp := IntToHex(CRC32, 8);
Result := STemp;
end;
Und daraus kannst du deine Seriennummer erstellen und mit Bindestrichen versehen.
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene
DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.