2010-12-22 16 views
1

Verwendung: Delphi 2010 und der JEDI Windows-API und JWSCLLsaAddAccountRights nicht für mich arbeitet

Ich versuche, die Anmeldung als Dienst Privileg für einen Benutzer mit LsaAddAccountRights Funktion zuweisen, aber es heißt nicht funktioniert. Nachdem die Funktion zurückgegeben wurde, zeigt das Einchecken im Gruppenrichtlinien-Editor an, dass der Benutzer immer noch nicht über die oben genannten Berechtigungen verfügt.

Ich verwende die Anwendung unter Windows XP.

Würde mich freuen, wenn jemand was in meinem Code falsch deuten könnte out ist:

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. 

Vielen Dank im Voraus.

+0

Bitte spezifizieren Sie "es funktioniert nicht". –

+0

@The Fox: Fertig, danke. – SteveL

+0

Was ist der Rückkehrcode von der Funktion? Es gibt ein HRESULT, wie es aussieht - 32 Bits ohne Vorzeichen. Ihr Code oben überprüft es nicht - bitte ändern Sie die Click-Prozedur in 'ShowMessage (IntToHex (AddPrivilegeToAccount ('Sam', 'SeServiceLogonRight'), 8));' und veröffentlichen Sie die Ausgabe. –

Antwort

2

Um in der Lage sein zu verwenden LsaAddAccountRights Sie Richtlinien Griff mit zusätzlichen POLICY_CREATE_ACCOUNT Flag (POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES) in LsaOpenPolicy oder verwenden MAXIMUM_ALLOWED anstelle der beiden Fahnen öffnen sollte.

+0

Vielen Dank. Es funktioniert jetzt. – SteveL

Verwandte Themen