utilisant: Delphi 2010 et jedi API Windows et JWSCLLsaAddAccountRights ne fonctionne pas pour moi
Je suis en train d'affecter la connexion comme un privilège de service à un utilisateur en utilisant la fonction de LsaAddAccountRights mais il ne fonctionne pas par exemple. après le retour de la fonction, la vérification dans l'Éditeur de stratégie de groupe montre que l'utilisateur n'a toujours pas le privilège mentionné ci-dessus.
Je cours l'application sur Windows XP.
serais heureux si quelqu'un pourrait pointer ce qui ne va pas dans mon code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, JwaWindows, JwsclSid;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function AddPrivilegeToAccount(AAccountName, APrivilege: String): DWORD;
var
lStatus: TNTStatus;
lObjectAttributes: TLsaObjectAttributes;
lPolicyHandle: TLsaHandle;
lPrivilege: TLsaUnicodeString;
lSid: PSID;
lSidLen: DWORD;
lTmpDomain: String;
lTmpDomainLen: DWORD;
lTmpSidNameUse: TSidNameUse;
lPrivilegeWStr: String;
begin
ZeroMemory(@lObjectAttributes, SizeOf(lObjectAttributes));
lStatus := LsaOpenPolicy(nil, lObjectAttributes, POLICY_LOOKUP_NAMES, lPolicyHandle);
if lStatus <> STATUS_SUCCESS then begin
Result := LsaNtStatusToWinError(lStatus);
Exit;
end;
try
lTmpDomainLen := DNLEN; // In 'clear code' this should be get by LookupAccountName
SetLength(lTmpDomain, lTmpDomainLen);
lSidLen := SECURITY_MAX_SID_SIZE;
GetMem(lSid, lSidLen);
try
if LookupAccountName(nil, PChar(AAccountName), lSid, lSidLen, PChar(lTmpDomain),
lTmpDomainLen, lTmpSidNameUse) then begin
lPrivilegeWStr := APrivilege;
lPrivilege.Buffer := PChar(lPrivilegeWStr);
lPrivilege.Length := Length(lPrivilegeWStr) * SizeOf(Char);
lPrivilege.MaximumLength := lPrivilege.Length;
lStatus := LsaAddAccountRights(lPolicyHandle, lSid, @lPrivilege, 1);
Result := LsaNtStatusToWinError(lStatus);
end
else
Result := GetLastError;
finally
FreeMem(lSid);
end;
finally
LsaClose(lPolicyHandle);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AddPrivilegeToAccount('Sam', 'SeServiceLogonRight');
end;
end.
Merci à l'avance.
Veuillez préciser "cela ne fonctionne pas". –
@The Fox: Fait, merci. – SteveL
Quel est le code retour de la fonction? Il renvoie un HRESULT, par son apparence - 32 bits non signés. Votre code ci-dessus ne le vérifie pas - veuillez changer la procédure de clic en 'ShowMessage (IntToHex (AddPrivilegeToAccount ('Sam', 'SeServiceLogonRight'), 8));' et enregistrez la sortie. –