LsaAddAccountRights schlägt fehl



  • Ich versuche mit obiger Funktion einer Benutzergruppe Privilegien zuzuordnen. Leider schlägt das mit der Fehlermeldung

    Ein angegebenes Recht ist nicht vorhanden

    fehl. Was bedeutet nun diese Fehlermeldung im einzelnen? Das poassiert sowohl bei schon vorhandenen Benutzergruppen, als auch bei selbst erstellten.

    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:

    procedure TForm1.Button3Click(Sender: TObject); 
    var 
      err: DWORD; 
    begin 
      err := GrantPrivilege('hal9000', 'Benutzer', 'SeBackupPrivilege', False); 
      if err <> 0 then 
        ShowMessage(SysErrorMessage(err)); 
    end;
    

    Gut, das ist jetzt Delphicode, aber am Code selber wird es wohl nicht liegen, er kompiliert und eine gültige SID und ein gültigs PolicyHandle bekomme ich auch. Desweiteren hat ein ähnlicher Code die selbe Fehlermeldung produziert.



  • Welche Funktion genau schlägt mit der obigen Meldung fehl? Kannst Du auch die Zahl posten? (ein deutscher Text ist immer schlecht)...



  • Also fehlschlagen tut LsaAddAccountRights mit dem Code -1073741728 und umgewandelt mit LsaNtStatusToWinError ergibt das 1313, was "Ein angegebenes Recht ist nicht vorhanden" entspricht. Wie gesagt, die SID und das Policyhandle scheinen gültig zu sein.



  • Ich muss das leider noch mal nach oben holen. 😞



  • Mir fällt leider nichts ein, ausser dass Dir ein Recht fehlt um die Berechtigungen zu ändern... (welches das aber ist kann ich Dir nicht sagen)



  • Hm, ja eventuell muss ich selbst als Admin erst noch das richtige Privileg aktivieren. Nur welches? 😞



  • Problem gelöst, der fehler lag an einer ganz anderen Stelle im Code. besten Dank aber trotzdem für deine Mühe Jochen.

    Das Ergebnis sollte sich gegen Ende des Monats in diesem Programm wieder finden, wenn alles gut geht. 😉



  • Luckie hast du dann auch noch c++ Code für uns 😃 😕



  • Leider nicht. Aber zu mindest C Code findest du im MSDN und PSDK. 😉


Anmelden zum Antworten