Как получить полное имя пользователя

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Как получить полное имя пользователя

Сообщение gvido »

Добрый день, Всем!!!

Ребяты, подскажите, как получить полное имя пользователя домена windows? Логин, домен, имя компьютера получить не проблема, но никак не могу получить полное имя, которое отображается в меню "пуск". Примеров сети вроде много, но все выдают чушь полную. Есть у кого работающий вариант?

Вот один из вариантов. Полагаю, что в дельфи сработает:

Код: Выделить всё

  function NetUserGetInfo(ServerName, UserName: PChar; Level: DWORD; var Buffer: Pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetUserGetInfo';
  function NetApiBufferFree(Buffer: pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
  function NetWkstaUserGetInfo(ServerName: PWideChar; Level: DWORD; var Buffer: Pointer): Longint; stdcall; external 'netapi32.dll' name 'NetWkstaUserGetInfo';

type
  TUserInfo1 = packed record
    UserName: PWideChar;
    DomainName : PWideChar;
    OtherDomainNames: PWideChar;
    ServerName: PWideChar;
  end;
  PUserInfo1 = ^TUserInfo1;

  TUserInfo2 = packed record
    Name: PWideChar;
    Password: PWideChar;
    PasswordAge: DWORD;
    Priv: DWORD;
    HomeDir: PWideChar;
    Comment: PWideChar;
    Flags: DWORD;
    ScriptPath: PWideChar;
    AuthorFlags: DWORD;
    FullName: PWideChar;
    UserComment: PWideChar;
    Params: PWideChar;
    WorkStations: PWideChar;
    LastLogon: DWORD;
    LastLogoff: DWORD;
    AccountExpires: DWORD;
    MaxStorage: DWORD;
    UnitsPerWeek: DWORD;
    LogonHours: DWORD;
    BadPasswordCount: DWORD;
    LogonCount: DWORD;
    Server: PWideChar;
    CountryCode: DWORD;
    Codepage: DWORD;
  end;
  PUserInfo2 = ^TUserInfo2;

function GetCurrentUser(): String;
var
  username: String;
  size: DWORD;
begin
  size := 255;
  SetLength(username, size) ;
  if GetUserName(PChar(username), size) then
    Result := Copy(username, 1, size - 1)
  else
    Result := '';
end;

function GetDomainServerName(): String;
var
  PUI1: PUserInfo1;
begin
  Result := '';
  if NetWkstaUserGetInfo(nil, 1, Pointer(PUI1)) = 0 then
  begin
    try
      Result := WideCharToString(PUI1^.ServerName);
    finally
      NetApiBufferFree(PUI1);
    end;
  end;
end;

function GetDomainFullName(const ServerName, UserName: string): string;
var
  PUI2: PUserInfo2;
begin
  if NetUserGetInfo(PChar(ServerName), PChar(UserName), 2, Pointer(PUI2)) = 0 then
    try
      Result := PUI2^.FullName;
    finally
      NetApiBufferFree(PUI2);
    end
  else
    Result := '';
end;     
end;
yus
новенький
Сообщения: 27
Зарегистрирован: 29.03.2015 13:29:29
Откуда: Москва

Сообщение yus »

Приветствую.
попробуй это.

Код: Выделить всё

uses
   ...JwaSecExt, JwaWinType;


там описана WinAPI функция GetUserNameEx.
описание тут https://msdn.microsoft.com/en-us/library/windows/desktop/ms724435(v=vs.85).aspx

Вызов примерно так.

Код: Выделить всё

GetUserNameEx(3, buf, size);  
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Приветствую.
попробуй это.
КОД: ВЫДЕЛИТЬ ВСЁ
uses
...JwaSecExt, JwaWinType;


там описана WinAPI функция GetUserNameEx.
описание тут https://msdn.microsoft.com/en-us/librar ... 35(v=vs.85).aspx

Вызов примерно так.
КОД: ВЫДЕЛИТЬ ВСЁ
GetUserNameEx(3, buf, size);


ААААААА, Шайтан!!!! Работает!!!!! Ура!!! Только не забывать нужно о перекодировке в UTF8

Спасибо большое. :)
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Добрый день, коллеги!!!
Если кому интересно...
понадобилось получить больше информации о пользователе домена. Но код который в первом посте не работал. Вернее работал, но не выдавал нужного результата.
потратил кучу времени чтобы срастить последние изменения в Lazarus с его UTF8 и постоянными правками перекодировки и API Windows.
Вот результат: Значения всех переменных которые имеют тип по MSDN unicode string это, мать ЕЁ UTF16!!!! Будь она не ладна или лазарусовский UTF8.
То есть вызов функции принимает такой вид, если ServerName и UserName объявлены как String(в отладчике светятся как ANSI String. Фактически строка UTF8)

Код: Выделить всё

NetUserGetInfo(PWideChar(Utf8toutf16(ServerName)), PWideChar(UTF8toUTF16(UserName)), 2, Pointer(PUI2)) = 0 then.......


Вот... Может кому это съэкономит бабло на таблетки от нервов. :)

P.S.
lazarus-1.8.4-fpc-3.0.4-win64 Windows 10 1803 x64
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Посмотри в RxFileUtils

Код: Выделить всё

//Текущий пользователь в системе
function GetUserName:string;
//Информация о владельце файла
function GetFileOwnerUser(const SearchDomain, FileName:String):String;
procedure GetFileOwnerData(const SearchDomain, FileName:String;out UserName, DomainName:string);
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Спасибо, Алекс.
В первом посте я писал, что мне нужно было ФИО пользователя для маленького проекта и подошла функция GetUserNameEx (Спасибо YUS).
Сейчас появилось время и немного другая задача: дата - время истечения срока пароля пользователя домена. "Юзвери" просто достали отмазками, что их система не предупреждает о необходимости сменить пароль.
Теперь точно не отмажутся :twisted: :mrgreen:
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Так это политика в виндовом домене настраивается - кол-во дней предупреждения перед сменой пароля.
В одной организации была переодичность раз в месяц - а предупреждение выводилось за 15 дней :-)
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Мои, "Юзвери", забивают на предупреждение системы об истечении срока действия пароля и необходимости его сменить. А потом, с таким не винным видом, говорят - Так не было никакого предупреждения!!!
Для меня как красная тряпка уже начало этой фразы....
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

По моему личному опыту периодически менять пароль системы у юзеров - очень плохая идея. Геморроя от нее всяко больше, чем пользы.
bpg
новенький
Сообщения: 36
Зарегистрирован: 28.11.2017 20:23:18

Сообщение bpg »

Вообще перекладывать на плечи пользователя какие то функции программы / программиста плохая идея. Бесят программисты которые делают вид что делают защиту, это я про все системы типа Крипто Про, VipNet оф и т.д., заставляют делать кучу всякой тупой нахрен не нужной ху...ни и потом ставить пароль на ключевой контейнер 12345678, просто жесть.
И другие идиоты, которые возомнили себя потомками Берии, заставляющие менять у юзеров пароль с периодичностью, да еще и по всем жестким требованиям, регистр. спец символы , и не повторяющийся.
В итоге юзер матерится, меняет, тратит время на никому не нужную хрень и тут же записывает этот пароль на бумажку и кидает рядом с системником.
Защита должна быть превентивной и решаться специалистом , а не сменой паролей.
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Ну, что вам сказать, коллеги... Меня многое бесит, как в себе, так и других, но есть требования к обеспечению информационной безопасности предприятия, утвержденное соответствующим Положением. И тут все должны исполнять утвержденные требования. На счет пользователей. Они реально тупеют. Чем больше автоматизируются рабочие места, тем более сотрудники становятся по поведению похожими на обезьянок. Через полгода они уже не могут нормально объяснить тот или иной процесс, операцию. Это печально.
Ответить