Toon posts:

[delphi] Dynamisch GetUserNameEx

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hi Folks,

Ik moet de Active Directory username ophalen vanuit Windows. Dit is geen enkel punt, want dat kan gewoon via Secur32.dll.
Deze DLL is er echter niet op Windows NT bijv. en omdat ik dan 2 executables moet aanhouden omdat 'ie anders bij het starten van de applicatie een error geeft dat de DLL niet gevonden is, vind ik dat lastig.

De DLL is nu statisch meegebakken, maar wil ik eigenlijk dynamisch laden.

De code is nu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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';

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


Werkt dus uitstekend, alleen is die DLL dus keihard meegelinkt. Niet leuk dus.

Voor Windows 98 bijv. laad ik ook een DLL, alleen dat gaat zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var
     Win95_NetUserGetInfo      : TWin95_NetUserGetInfo;
     Win95_NetWkstaUserGetInfo : TWin95_NetWkstaUserGetInfo;
     Win95_NetApiBufferFree    : TWin95_NetApiBufferFree;

     WinNT_NetWkstaGetInfo  : TWinNT_NetWkstaGetInfo;
     WinNT_NetApiBufferFree : TWinNT_NetApiBufferFree;

     WSNT : ^WKSTA_INFO_100;
     WS95 : ^WKSTA_USER_INFO_1;

     EC      : DWORD;
     hNETAPI : THandle;
begin

          // windows 95/98
          hNETAPI := LoadLibrary( 'RADMIN32.DLL' );
          if hNETAPI <> 0 then begin
  //           showmessage( 'win95 / win98 / winme client' );
             @Win95_NetApiBufferFree := GetProcAddress( hNETAPI, 'NetApiBufferFree' );
             @Win95_NetUserGetInfo   := GetProcAddress( hNETAPI, 'NetUserGetInfoA' );

             EC := Win95_NetWkstaUserGetInfo( nil, 1, Pointer( WS95 ) );
             if EC = 0 then begin
               Domain   := WS95^.wkui1_logon_domain;
               Username := WS95^.wkui1_username;
               Win95_NetApiBufferFree( Pointer( WS95 ) );

               filledIn := True;
               Info.ID       := 'CN=' + Username + '.O=' + Domain;
               Info.FullName := Info.ID;
             end;
           end;


Op internet is helaas niet zo bijster veel te vinden over hoe je dit aan moet pakken. Iemand enig idee?

[ Voor 3% gewijzigd door Verwijderd op 22-09-2004 21:19 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:06

Creepy

Tactical Espionage Splatterer

Je kan op dezelfde manier ook de GetUserNameEx dynamisch inladen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ok, beetje geprogged dus :)
Maar dit werkt nog niet naar wens:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  function getActiveDirectoryAuthentication : TLogonInfo;
  type
    //Win2000 Active Directory equivalents from SECUR32.DLL
    TWin2000_ActiveDirGetUserNameEx = function (NameFormat: DWORD; lpNameBuffer: LPSTR; nSize: PULONG): Boolean; stdcall;
  var
    Info     : TLogonInfo;
    EC       : DWORD;
    hSECUR32 : THandle;
    Size     : DWORD;
    Username : array[0..250] of Char;
    Win2000_ActiveDirGetUserNameEx: TWin2000_ActiveDirGetUserNameEx;
  begin
    // windows 95/98
    hSECUR32 := LoadLibrary( 'SECUR32.DLL' );
    if hSECUR32 <> 0 then begin
      @Win2000_ActiveDirGetUserNameEx := GetProcAddress( hSECUR32, 'GetUserNameExA' );
      Size := 250;
      if Win2000_ActiveDirGetUserNameEx( NameFullyQualifiedDN, @UserName, @Size ) then begin
        Info.ID := username;
        ShowMessage( 'Username gevonden: ' + Info.ID );
      end;
    end;
    Result := Info;
  end;


Win2000_ActiveDirGetUserNameEx() geeft FALSE terug waardoor ik nog geen username hebt. Iemand enig idee.. misschien een geheugenprobleempje oid?

Verwijderd

Topicstarter
Okay, probleem opgelost. NameSamCompatible werkt wel goed. Het lijkt er dus op dat het probleem is dat deze win2000 machine (niet aangemeld op AD domein) geen response op de DN heeft :)
Thanks iedereen voor de tips :P