Avatar billede snowball Novice
19. august 2004 - 10:16 Der er 19 kommentarer og
2 løsninger

Fulde navn på den bruger der logget ind

Hej.

Hvordan kan jeg finde ud af det fulde navn på den bruger som er logget ind? Det står ikke umiddelbart i reg.db'en.

Det navn jeg snakker om er hvis man trykker på CTRL+ALT+DELETE, så står der i toppen under Logon Information "Mit Navn is logged on as DOMIAN\USER" og det er så "Mit Navn" jeg gerne vil finde.

På forhånd tak.
Avatar billede vallemanden Nybegynder
19. august 2004 - 11:22 #1
{1.}
function GetCurrentUserName: string;
const
  cnMaxUserNameLen = 254;
var
  sUserName: string;
  dwUserNameLen: DWORD;
begin
  dwUserNameLen := cnMaxUserNameLen - 1;
  SetLength(sUserName, cnMaxUserNameLen);
  GetUserName(PChar(sUserName), dwUserNameLen);
  SetLength(sUserName, dwUserNameLen);
  Result := sUserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetCurrentUserName);
end;

{2.}

function GetCurrentUserName(var CurrentUserName: string): Boolean;
var
  BufferSize: DWORD;
  pUser: PChar;
begin
  BufferSize := 0;
  GetUserName(nil, BufferSize);
  pUser := StrAlloc(BufferSize);
  try
    Result := GetUserName(pUser, BufferSize);
    CurrentUserName := StrPas(pUser);
  finally
    StrDispose(pUser);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CurrentUserName: string;
begin
  GetCurrentUserName(CurrentUserName);
  Label1.Caption :=  CurrentUserName;
end;

{*********************************************}

{
  Windows NT/2000/XP:

  The GetUserNameEx function retrieves the name of the user or other
  security principal associated with the calling thread.
  You can specify the format of the returned name.
  If the thread is impersonating a client, GetUserNameEx
  returns the name of the client.
}

const
  NameUnknown = 0; // Unknown name type.
  NameFullyQualifiedDN = 1;  // Fully qualified distinguished name
  NameSamCompatible = 2; // Windows NT® 4.0 account name
  NameDisplay = 3;  // A "friendly" display name
  NameUniqueId = 6; // GUID string that the IIDFromString function returns
  NameCanonical = 7;  // Complete canonical name
  NameUserPrincipal = 8; // User principal name
  NameCanonicalEx = 9;
  NameServicePrincipal = 10;  // Generalized service principal name
  DNSDomainName = 11;  // DNS domain name, plus the user name


procedure GetUserNameEx(NameFormat: DWORD;
  lpNameBuffer: LPSTR; nSize: PULONG); stdcall;
  external 'secur32.dll' Name 'GetUserNameExA';


function LoggedOnUserNameEx(fFormat: DWORD): string;
var
  UserName: array[0..250] of char;
  Size: DWORD;
begin
  Size := 250;
  GetUserNameEx(fFormat, @UserName, @Size);
  Result := UserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := LoggedOnUserNameEx(NameSamCompatible);
end;
Avatar billede snowball Novice
19. august 2004 - 12:11 #2
vallemanden: Ingen af de nævnte eksempler kan give mig den information jeg beskriver i mit spørgsmål. Det er kommer tættest på er domain og brugernavn, men det er jo ikke det jeg ønsker ;)
Avatar billede hinker Nybegynder
19. august 2004 - 14:00 #3
Måske dette kan bruges fundet i MS SDK help :
PSS ID Number: Q119670

Authored 20-Aug-1994            Last modified 05-Jan-1995

The information in this article applies to:

- Microsoft Win32 Software Development Kit (SDK) for Windows NT,
  versions 3.1 and 3.5


SUMMARY

Windows NT workstations can be organized into a domain, which is a
collection of computers on a Windows NT Advanced Server network. The domain
administrator maintains centralized user and group account information.


MORE INFORMATION

To find the full name of a user if you have the user name and domain name:

1. Convert the user name and domain name to Unicode, if they are not
  already Unicode strings. This is a requirement of the ported LAN
  Manager APIs that are used in the following steps.

2. Look up the name of the domain controller (DC) for the domain name
  by calling NetServerEnum().

3. Look up the user name by calling NetUserGetInfo()

4. Convert the full user name to ANSI, unless the program is expecting

  to work with Unicode strings.

The sample code below is a function that takes a user name and a domain
name as the first two arguments and returns the user's full name in the
third argument.

For information on how to get the current user and domain, please see the
following article in the Microsoft Knowledge Base:

ARTICLE-ID: Q111544
TITLE    : Looking Up the Current User and Domain

Sample Code
-----------

  #include <windows.h>
  #include <lm.h>

  #include <stdio.h>

  /********************************************************************\
  * Function: GetFullName( char *UserName, char *Domain, char *dest ); *
  *                                                                    *
  * Parameters:                                                        *
  *    UserName: the user name                                        *
  *    Domain  : the domain to which the user belongs                  *
  *    dest    : receives the user's full name                        *

  *                                                                    *
 
  BOOL GetFullName(char *UserName, char *Domain, char *dest)
  {
      WCHAR  wszUserName[256];          // Unicode user name
      WCHAR  wszDomain[256];
      LPBYTE ComputerName;

      struct _SERVER_INFO_100 *si100;  // Server structure
      struct _USER_INFO_2 *ui;          // User structure

      // Convert ASCII user name and domain to Unicode.

      MultiByteToWideChar( CP_ACP, 0, UserName,

        strlen(UserName)+1, wszUserName, sizeof(wszUserName) );
      MultiByteToWideChar( CP_ACP, 0, Domain,
        strlen(Domain)+1, wszDomain, sizeof(wszDomain) );

      // Get the computer name of a DC for the specified domain.

      NetGetDCName( NULL, wszDomain, &ComputerName );

      // Look up the user on the DC.

      if(NetUserGetInfo( (LPWSTR) ComputerName,
        (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui))
      {
        printf( "Error getting user information.\n" );

        return( FALSE );
      }

      // Convert the Unicode full name to ASCII.

      WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name,
        -1, dest, 256, NULL, NULL );

      return( TRUE );
  }

Additional reference words: 3.10 3.50
KBCategory: kbnetwork kbprg
KBSubcategory: NtwkLmapi
Avatar billede vallemanden Nybegynder
19. august 2004 - 14:06 #4
øhh er det ikke delphi kode du søger??
kan se hinker's kode er til c
Avatar billede snowball Novice
19. august 2004 - 14:10 #5
Jo, det skal være til Delphi.
Avatar billede vallemanden Nybegynder
19. august 2004 - 14:25 #6
øhh, forresten hvilket os køre du med?
Avatar billede snowball Novice
19. august 2004 - 14:29 #7
Det skal bare virke i Win2k og WinXP.
Avatar billede vallemanden Nybegynder
19. august 2004 - 14:33 #8
function GetCurrentUserName(var CurrentUserName: string): Boolean;
var
  BufferSize: DWORD;
  pUser: PChar;
begin
  BufferSize := 0;
  GetUserName(nil, BufferSize);
  pUser := StrAlloc(BufferSize);
  try
    Result := GetUserName(pUser, BufferSize);
    CurrentUserName := StrPas(pUser);
  finally
    StrDispose(pUser);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  CurrentUserName: string;
begin
  GetCurrentUserName(CurrentUserName);
  Label1.Caption :=  CurrentUserName;
end;

Det virker for mig
Avatar billede snowball Novice
19. august 2004 - 14:40 #9
vallemanden: Det stykke kode har du jo skrevet én gang tidligere, og det er stadig ikke den information jeg søger. Prøv venligst og læs mit spørgsmål igen ;)
Avatar billede vallemanden Nybegynder
19. august 2004 - 14:43 #10
jeg køre xp, når jeg trykker på CTRL+ALT+Del står der ikke noget navn, men med det stykke kode får jeg den bruger der er logget ind på pc'en. og hvis det ikke er det du skal bruge så forstår jeg ikke dit spg. Og så undskylder jeg meget, men tak for din tålmodighed :)
Avatar billede snowball Novice
19. august 2004 - 15:01 #11
Det er fordi du ikke er logget på et domæne - det burde jeg nok have nævnt, og det beklager jeg.

Et eksempel på det jeg ønsker kan ses på http://www.itpro.no/images/shots/rdp_securityboks.jpg

I dette tilfælde ønsker jeg så at finde "Frank Aune"
Avatar billede vallemanden Nybegynder
19. august 2004 - 15:05 #12
hmm, og det nederste af koden viker ikke på det?

const
  NameUnknown = 0; // Unknown name type.
  NameFullyQualifiedDN = 1;  // Fully qualified distinguished name
  NameSamCompatible = 2; // Windows NT® 4.0 account name
  NameDisplay = 3;  // A "friendly" display name
  NameUniqueId = 6; // GUID string that the IIDFromString function returns
  NameCanonical = 7;  // Complete canonical name
  NameUserPrincipal = 8; // User principal name
  NameCanonicalEx = 9;
  NameServicePrincipal = 10;  // Generalized service principal name
  DNSDomainName = 11;  // DNS domain name, plus the user name


procedure GetUserNameEx(NameFormat: DWORD;
  lpNameBuffer: LPSTR; nSize: PULONG); stdcall;
  external 'secur32.dll' Name 'GetUserNameExA';


function LoggedOnUserNameEx(fFormat: DWORD): string;
var
  UserName: array[0..250] of char;
  Size: DWORD;
begin
  Size := 250;
  GetUserNameEx(fFormat, @UserName, @Size);
  Result := UserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := LoggedOnUserNameEx(NameSamCompatible);
end;
Avatar billede snowball Novice
19. august 2004 - 15:13 #13
Nej. I bedste fald giver de mig navnet på domænet og/eller brugernavnet (har prøvet med alle konstanterne).
Avatar billede vallemanden Nybegynder
19. august 2004 - 15:18 #14
ok du får altså 'kun' frank og du vil have Frank Aune, eller har jeg ikke fattet en meter endnu :)
Avatar billede snowball Novice
19. august 2004 - 15:23 #15
Du har ikke forstået spørgsmålet så :)

Kig på http://www.itpro.no/images/shots/rdp_securityboks.jpg - Det jeg gerne vil have er navnet, som i dette tilfælde er "Frank Aune". Det som dine eksempeler i bedste fald kan give er domænet og/eller brugernavnet, som i dette tilfælde er "THEONE\frank"
Avatar billede vallemanden Nybegynder
19. august 2004 - 15:26 #16
oki
Avatar billede vallemanden Nybegynder
19. august 2004 - 15:47 #17
nu kan jeg jo ikke teste det men prøv lige denne


type
  USER_INFO_1 = record
    usri1_name: LPWSTR;
    usri1_password: LPWSTR;
    usri1_password_age: DWORD;
    usri1_priv: DWORD;
    usri1_home_dir: LPWSTR;
    usri1_comment: LPWSTR;
    usri1_flags: DWORD;
    usri1_script_path: LPWSTR;
  end;
  lpUSER_INFO_1 = ^USER_INFO_1;

function NetUserEnum(ServerName: PWideChar;
  Level,
  Filter: DWORD;
  var Buffer: Pointer;
  PrefMaxLen: DWORD;
  var EntriesRead,
  TotalEntries,
  ResumeHandle: DWORD): Longword; stdcall; external 'netapi32.dll';

function NetApiBufferFree(pBuffer: PByte): Longint; stdcall; external
'netapi32.dll';

{...}

procedure TForm1.Button1Click(Sender: TObject);
var
  EntiesRead: DWORD;
  TotalEntries: DWORD;
  UserInfo: lpUSER_INFO_1;
  lpBuffer: Pointer;
  ResumeHandle: DWORD;
  Counter: Integer;
  NetApiStatus: LongWord;
begin
  ResumeHandle := 0;
  repeat
    // NetApiStatus :=
    // NetUserEnum(PChar('\\NT-Domain'), 1, 0, lpBuffer, 0,EntiesRead, TotalEntries, ResumeHandle);
    NetApiStatus := NetUserEnum(nil, 1, 0, lpBuffer, 0, EntiesRead,
      TotalEntries, ResumeHandle);
    UserInfo    := lpBuffer;

    for Counter := 0 to EntiesRead - 1 do
    begin
      listbox1.Items.Add(WideCharToString(UserInfo^.usri1_name) + ' --> ' +
        WideCharToString(UserInfo^.usri1_comment));
      Inc(UserInfo);
    end;

    NetApiBufferFree(lpBuffer);
  until (NetApiStatus <> ERROR_MORE_DATA);
end;
Avatar billede snowball Novice
20. august 2004 - 07:32 #18
Det ligner noget som godt kan bruges, men jeg får bare en "Stack overflow" fejl når jeg prøver på at bruge den.
Avatar billede snowball Novice
26. august 2004 - 12:15 #19
Problemet er ikke længere aktuelt. Fandt aldrig en løsning på det.

vallemanden: Lav et svar hvis du vil have lidt point som tak for forsøget ;)
Avatar billede vallemanden Nybegynder
26. august 2004 - 12:28 #20
jamen mange tak så
Avatar billede snowball Novice
26. august 2004 - 12:35 #21
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester