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.
