Ich versuche gerade mir die Privilegien, die eine Gruppe hat auflisten zu lassen. dassieht bisher so aus:
Delphi-Quellcode:
function OpenPolicy(const Server: WideString): THandle;
var
ObjectAttributes: TLSA_OBJECT_ATTRIBUTES;
lusSystemName: TLSA_UNICODE_STRING;
begin
ZeroMemory(@ObjectAttributes, sizeof(TLSA_OBJECT_ATTRIBUTES));
lusSystemName.Buffer := PWideString(Server);
lusSystemName.len := length(Server) * 2;
lusSystemName.MaxLen := (length(Server) + 1) * 2;
LsaOpenPolicy(@lusSystemName, @ObjectAttributes, POLICY_LOOKUP_NAMES, result);
end;
function GetGroupPrivileges(const Server, Group: WideString): TStringArray;
var
PolicyHandle: THandle;
Privileges: TLSA_UNICODE_STRING;
Count: Cardinal;
SID: PSID;
ret: NTSTATUS;
i: Integer;
begin
GetAccountSid(Server, Group, SID);
PolicyHandle := OpenPolicy('hal9000');
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;
Eine gültige SID und ein gültiges PolicyHandle habe ich. Nur leider schlägt
LsaEnumerateAccountRights mit der Fehlermeldung:
Zitat:
Das System kann die angegebene Datei nicht finden
fehl. Und bei manchen Gruppen bekomme ich auch eine
AV in der kernel32.dll:
Zitat:
Access violation at address 77EB8E60 in module 'kernel32.dll'. Read of address 00142000.
Was mache ich also falsch?