So, ich habe mir das jetzt mal angeguckt. Mein Code sieht jetzt so aus für die beiden Funktionen:
Delphi-Quellcode:
function OpenPolicy(const Server: WideString; var hPolicy: THandle): DWORD;
var
ObjectAttributes : TLSA_OBJECT_ATTRIBUTES;
lusSystemName : TLSA_UNICODE_STRING;
Status : NTSTATUS;
begin
ZeroMemory(@ObjectAttributes, sizeof(TLSA_OBJECT_ATTRIBUTES));
lusSystemName.Buffer := AllocMem(lusSystemName.MaxLen);
lusSystemName.len := length(Server) * sizeof(WideChar);
lusSystemName.MaxLen := lusSystemName.len + sizeof(WideChar);
FillChar(ObjectAttributes, Sizeof(TLSA_OBJECT_ATTRIBUTES), 0);
try
Status := LsaOpenPolicy(@lusSystemName, @ObjectAttributes, POLICY_LOOKUP_NAMES, hPolicy);
if Status = STATUS_SUCCESS then
begin
result := 0;
end
else
begin
result := LsaNtStatusToWinError(Status);
end;
finally
FreeMem(lusSystemName.Buffer);
end;
end;
Und:
Delphi-Quellcode:
function GetGroupPrivileges(const Server, Group: WideString): TStringArray;
var
PolicyHandle : THandle;
Privileges : TLSA_UNICODE_STRING;
Count : Cardinal;
SID : PSID;
ret : LongWord;
i : Integer;
begin
GetAccountSid(Server, Group, SID);
ret := OpenPolicy(Server, PolicyHandle);
if ret = 0 then
begin
ret := LsaEnumerateAccountRights(PolicyHandle, SID, Privileges, Count);
if ret = 0 then
begin
setlength(result, Count);
for i := 0 to Count - 1 do
begin
result[i] := string(Privileges.Buffer);
end;
end
else
ShowMessage(SysErrorMessage(LsaNtStatusToWinError(ret)));
end
else
ShowMessage(SysErrorMessage(ret));
end;
Also OpenPolicy scheint ganz gut zu klappen nur
LsaEnumerateAccountRights schlägt fehl. Entweder bekomme ich eine
AV in der kernel32.dll oder die Meldung:
Zitat:
Das System kann die angegebene Datei nicht finden
Wer kann mir da noch jetzt helfen?