Hallo,
vielen Dank für die Antwort, es war von jedem etwas dabei.
Die Lösung habe ich gefunden, wenn man eine Accountabfrage mit nil als Server und mit dem PC Namen als User durchführt, bekommt man den SID für das System.
(Mac Id habe ich bei einem andern Projekt hergenommen. das hat aber bei Notebooks zu Problemen geführt, da diese schon mal den Kabel-Lan auf Wireless-lan umstellen und damit ist die MAC adresse eine andere)
Hier der Code, falls ihn jemand mal braucht :
Delphi-Quellcode:
unit GetSystemSIDUnit;
interface
uses
Windows, SysUtils;
function GetSystemSID:
string;
function ConvertSidToStringSid(SID: PSID;
var StringSid: LPSTR): Boolean;
stdcall;
external '
advapi32.dll'
name '
ConvertSidToStringSidA';
implementation
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;
end.