Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Получить имя пользователя


Автор: bems 15.2.2006, 10:01
GetUserName возвращает имя пользователя каким оно было создано. После переименования хотелось бы выводить новое имя

Автор: _hunter 15.2.2006, 12:03
есть очень простой способ получить имя пользователя, зная имя пользователя. вот он:
userName := knownUserName;
( где knownUserName -- известное имя пользователя ( типы переменных -- string' и) )

Автор: Snowy 15.2.2006, 12:12
Попробуй такой код:
Код
function GetUserNameEx(NameFormat: dword; lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall; external 'Secur32.dll' name 'GetUserNameExA';

procedure TForm1.Button1Click(Sender: TObject);
var
  p: PChar;
  i: dword;
  w: dword;
begin
  w := 256;
  GetMem(p, w);
  if GetUserName(p, w) then
    Memo1.Lines.Add(p);
  for i := 1 to 12 do
    if GetUserNameEx(i, p, w) then
      Memo1.Lines.Add(IntToStr(i) + ': ' + p);
  FreeMem(p);
end;
Покажет все варианты имени. Какой подойдет - такой номер и выбирай.
Добавлено @ 12:15
Не могу оттестить - доменные юзеры не переименовываются, поэтому на тройку ничего у меня не возвращает.
P.S. Работает только под Win2k и выше.

Автор: bems 15.2.2006, 19:19
добавил ветку else:
Код

else begin
     formatmessage(format_message_from_system,nil,getlasterror,0,p,w,nil);
     Memo1.Lines.Add(IntToStr(i) + ': ' + p)
     end;

и получил
Код

1: Именам пользователей не сопоставлены коды защиты данных.

2: BOSS\Bems
3: BOSS\Bems
4: Именам пользователей не сопоставлены коды защиты данных.

5: Именам пользователей не сопоставлены коды защиты данных.

6: Именам пользователей не сопоставлены коды защиты данных.

7: Именам пользователей не сопоставлены коды защиты данных.

8: Именам пользователей не сопоставлены коды защиты данных.

9: Именам пользователей не сопоставлены коды защиты данных.

10: Именам пользователей не сопоставлены коды защиты данных.

11: Именам пользователей не сопоставлены коды защиты данных.

12: Именам пользователей не сопоставлены коды защиты данных.



Bems - было до переименования smile

Автор: Snowy 16.2.2006, 00:13
Тогда WMI. Класс Win32_UserAccount.
Только вот примера у меня нет.
Могу только дать пример на VB из MSDN:
Код

On Error Resume Next
strComputer = "."

Set objUserAccount = GetObject("winmgmts" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2:Win32_UserAccount.Domain='MyDomainName',Name='MyUserName' ")

If Err = 0 Then
    WScript.Echo objUserAccount.FullName
Else
    WScript.Echo "No object found" & Err.Number
End If

Автор: bems 16.2.2006, 10:08
Списибо, я разберусь

Автор: bems 21.2.2006, 11:25
Вот оно как:
Код

type USER_INFO_10=record
                  usri10_name,
                  usri10_comment,
                  usri10_usr_comment,
                  usri10_full_name:pwidechar
                  end;
pUSER_INFO_10=^USER_INFO_10;

function NetUserGetInfo(servername,username:pwidechar;level:dword;var bufptr:pUSER_INFO_10):dword;stdcall;external 'Netapi32.dll';
function NetApiBufferFree(Buffer:pointer):dword;stdcall;external 'Netapi32.dll';

procedure TForm1.FormDblClick(Sender: TObject);
var uinfo:pUSER_INFO_10;b:pwidechar;s:dword;
begin
s:=255;
GetMem(b,s);
GetUserNameW(b,s);
if (NetUserGetInfo(nil,b,10,uinfo)=0) then
   begin
   if uinfo.usri10_full_name^=#0000 then messageboxw(0,uinfo.usri10_name,b,0)
                                    else messageboxw(0,uinfo.usri10_full_name,b,0);
   NetApiBufferFree(uinfo);
   end;
FreeMem(b,s);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)