Zitat von
marabu:
Hallo,
ich habe von deinen Tests gelesen.
Ist dabei verwertbarer Code entstanden, den du hier veröffentlichen möchtest?
Freundliche Grüße
Ich hab Luckies Code genommen und ausgeführt und dabei festgestellt, dass der Puffer für den Domainname immer mit angegeben werden muss. Sobald man den SID-Name in den Puffer kopieren will, darf der Domainpuffer NICHT nil sein.
Ich habe es nicht hinbekommen, dass die Funktion TRUE geliefert hat, wenn der Domainpuffer nil war (und dessen Längen-Begleiter).
ODER: Die Funktion scheitert zwar nicht mit einer
AV, jedoch gibt sie eben auch kein TRUE zurück.
Delphi-Quellcode:
uses
JclDebug,
jwaWindows,
jwaSddl,
Windows;
function StrSIDToName(const StrSID: widestring; var Name: wideString; var SIDType: DWORD): Boolean;
var
SID : PSID;
Buffer,B2 : PwideChar;
NameLen, TempLen : Cardinal;
success : Boolean;
TS : TSecurityID;
res : Integer;
begin
SID := nil;
success := true;
success := ConvertStringSidToSidW(PWideChar(StrSID), jwaWindows.PSID(SID));
if success then
begin
NameLen := 0;
TempLen := 0;
SetLastError(0);
if not LookupAccountSidW(nil, SID, nil, NameLen, nil, TempLen, SIDType) and
(GetLastError() = ERROR_INSUFFICIENT_BUFFER) then
begin
GetMem(Buffer, NameLen * sizeOf(wideChar));
GetMem(B2, TempLen * sizeOf(wideChar));
if (Buffer <> nil) then
try
SetLastError(0);
success := LookupAccountSidW(nil, SID, Buffer, NameLen, B2, TempLen, SIDType);
if not success then
RaiseLastOSError;
if success then
SetString(Name, Buffer, Namelen);
finally
FreeMem(Buffer);
FreeMem(B2);
end;
end
else
RaiseLastOSError;
end
else
RaiseLastOSError;
LocalFree(HLOCAL(SID));
result := success;
end;
In meiner Security Library habe ich übrigens diesen Code in etwa auch so drin. Und den verwende ich ständig
, besonders auch, da SIDs eigentlich überall gebraucht werden.