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
Postar um comentário