Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

LsaAddAccountRights schlägt fehl

  Alt 15. Nov 2005, 00:01
Ich benutze folgende Funktion von Colin Wilson, um Gruppen ein Privileg zu zordnen:
Delphi-Quellcode:
function GrantPrivilege(const Server, user, privilege: string; bRemove: boolean): DWORD;
var
  sid : PSID;
  strSID : PWideChar;
  sidSize, sidNameUse: DWORD;
  domainNameSize : DWORD;
  domainName : array[0..DNLEN] of char;
  attributes : TLsaObjectAttributes;
  policyHandle : LSA_HANDLE;
  lsaComputerName, rightsLsaUnicodeString: TLSAUnicodeStr;
  status : NTStatus;

begin
  result := 0;
  sidSize := 65536;
  GetMem(sid, sidSize);
  domainNameSize := DNLEN + 1;
  try
    if LookupAccountName(PChar(Server), PChar(user), sid, sidSize, domainName, domainNameSize, sidNameUse) then
    begin
      lsaComputerName := TLsaUnicodeStr.CreateFromStr(Server);
      try
        FillChar(attributes, SizeOf(attributes), 0);
        status := LsaOpenPolicy(lsaComputerName.value, attributes, POLICY_CREATE_ACCOUNT or POLICY_LOOKUP_NAMES, policyHandle);
        if status = STATUS_SUCCESS then
        try
          rightsLsaUnicodeString := TLsaUnicodeStr.CreateFromStr(privilege);
          try
            if bRemove then
              status := LsaRemoveAccountRights(PolicyHandle, sid, False, @rightsLsaUnicodeString.value, 1)
            else
              status := LsaAddAccountRights(PolicyHandle, sid, @rightsLsaUnicodeString.value, 1);

            if status <> STATUS_SUCCESS then
              result := (LsaNtStatusToWinError(status));
          finally
            rightsLsaUnicodeString.Free
          end
        finally
          LsaClose(PolicyHandle)
        end
      finally
        lsaComputerName.Free
      end
    end
  finally
    FreeMem(sid)
  end
end;
aufruf mit:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  err: DWORD;
begin
  err := GrantPrivilege('hal9000', 'Benutzer', 'SeBackupPrivilege', False);
  if err <> 0 then
    ShowMessage(SysErrorMessage(err));
end;
Die SID und das PolicyHandle sollten gültig sein. Trotzdem bekomme ich als Administrator immer ein:
Zitat:
Ein angegebenes Recht ist nicht vorhanden
zurück. Und ich verstehe ehrlich gesagt nicht warum. Beim Entfernen bekomme ich übrigens die gleiche Fehlermeldung.

Ich habe mal ein Demo-Projekt angehangen, dann könnt ihr es selber mal testen. Der Code muss als Administrator ausgeführt werden, sonst geht es nicht!
Angehängte Dateien
Dateityp: zip xp_gruppenverwaltung_996.zip (17,8 KB, 37x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat