2010-12-22 4 views
1

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.

+0

Veuillez préciser "cela ne fonctionne pas". –

+0

@The Fox: Fait, merci. – SteveL

+0

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. –

Répondre

2

Pour pouvoir utiliser LsaAddAccountRights vous devez ouvrir la poignée de la politique avec le drapeau supplémentaire POLICY_CREATE_ACCOUNT (POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES) dans LsaOpenPolicy ou utiliser MAXIMUM_ALLOWED au lieu des deux drapeaux.

+0

Merci beaucoup. Il fonctionne maintenant. – SteveL