A API GetuserNameEx

Primeiro de tudo, a função GetUserNameEx se encontra na dll Secur32.dll e, como outras funções da API do windows, possui duas versões, uma ANSI (GetUserNameExA) e uma WIDE (GetUserNameExW).

Abaixo segue o cabeçalho para importação dessas duas funções.

function GetUserNameExA(NameFormat: TEXTENDED_NAME_FORMAT; lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall external 'Secur32.dll' name 'GetUserNameExA';
function GetUserNameExW(NameFormat: TEXTENDED_NAME_FORMAT; lpBuffer: PWideChar; var nSize: DWORD): BOOL; stdcall external 'Secur32.dll' name 'GetUserNameExW';


Atenção especial para o parâmetro NameFormat do tipo TEXTENDED_NAME_FORMAT. Ele é na verdade um Enum com alguns valores fixos. (no C também é um enum, e usa-se um ponteiro para ele)

  TEXTENDED_NAME_FORMAT  =
  (
    NameUnknown            = 0,
    NameFullyQualifiedDN   = 1,
    NameSamCompatible      = 2,
    NameDisplay            = 3,
    NameUniqueId           = 6,
    NameCanonical          = 7,
    NameUserPrincipal      = 8,
    NameCanonicalEx        = 9,
    NameServicePrincipal   = 10,
    NameDnsDomain          = 12
  );

Criei essas duas funções que me retornam uma string (UnicodeString no Delphi 2010) ou AnsiString para testar e facilitar o uso da GetUserNameEx (A ou W).

function TForm1.VtrGetUserNameExW(NameFormat: TEXTENDED_NAME_FORMAT): string;
var
  I: DWord;
begin
  I := 1000;
  SetLength(Result, I);
  GetUserNameExW(NameFormat, PChar(Result), I);
  Result := string(PChar(Result));
end;

function TForm1.VtrGetUserNameExA(NameFormat: TEXTENDED_NAME_FORMAT): AnsiString;
var
  I: DWord;
begin
  I := 1000;
  SetLength(Result, I);
  GetUserNameExA(NameFormat, PAnsiChar(Result), I);
  Result := AnsiString(PAnsiChar(Result));
end;



Estou alocando um espaço de 1000 caracteres para o resultado. É arbitrário. Quem souber uma maneira melhor de fazer isso, talvez usando outra api para saber o tamanho do nome do usuário de antemão, por favor me avise.

para testar chamo todas as funções, GetUserNameEx (A e W) passando todos os parâmetros possíveis de NameUnknown (0) a NameDnsDomain (12) e vejo o resultado.

procedure TForm1.Button2Click(Sender: TObject);
var
  enf: TEXTENDED_NAME_FORMAT;
begin
    Memo1.Lines.Add('Versão Wide -----------------------------------');
    enf := NameUnknown;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameFullyQualifiedDN;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameSamCompatible;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameDisplay;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameUniqueId;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameCanonical;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameUserPrincipal;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameCanonicalEx;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameServicePrincipal;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));

    enf := NameDnsDomain;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));


    Memo1.Lines.Add('Versão Ansi -----------------------------------');
    enf := NameUnknown;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameFullyQualifiedDN;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameSamCompatible;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameDisplay;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameUniqueId;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameCanonical;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameUserPrincipal;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameCanonicalEx;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameServicePrincipal;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

    enf := NameDnsDomain;
    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));

end;


Comentários

Postagens mais visitadas deste blog

Detectar o encoding de um arquivo para não corromper ao transformá-lo

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Quebras de linha no Delphi 2010