Arjun babu
Arjun babu

Reputation: 617

GetUserNameExA function cannot give user Details at system startup time(GINA)?

i am using c++ win32 API.

i tried to get user details using GetUserNameExA();

i have use this function into system logondialog source(GINA). in my logfile,it gives

CN=ComputerName,CN=Computers,DC=JEGAN,DC=COM".

But it's used after logon on to system,at that time it gives user details like "CN=sanju,CN=USERS,DC=JEGAN,DC=COM" in my other solution.

i want user details only,but it gives system details at the logon time,how can i achieve user details at logontime?

note: i have already tried ADSI,LDAP functions & directoryservices cant able to use.so suggest any other system functions.

Upvotes: 1

Views: 655

Answers (2)

Gregg Browinski
Gregg Browinski

Reputation: 546

David is correct - the GINA DLL is loaded by the WinLogon.exe process. Check Task Manager and you'll see that WinLogon.exe runs as Local System. The GetUserName and GetUserNameEx functions provide information about the identity for the current thread:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435.aspx

From a 20,000 foot view, after a user's credentials have been validated, the GINA notifies all Network Providers of the successful login. After this, it loads the user's profile and creates the user's shell (Explorer.exe) which is then displayed.

You might try using a Network Provider instead. They are fully supported up through Windows 8 and multiple NPs can be defined for the system so you won't run into the 'chaining' issues that GINAs have.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa378775.aspx

The NPLogonNotify function will receive the user's cleartext name, domain and password (sometimes you'll receive a UPN as username in which case the domain is blank). You can use this information as is, perform LDAP-based lookups to AD or use LogonUser & ImpersonateLoggedOnUser before calling GetUserNameEx. Be extremely careful with this last approach since network providers run as Local system within the WinLogon.exe process. Always call RevertToSelf and CloseHandle to undo/clean up the previous calls.

Upvotes: 5

0xC0000022L
0xC0000022L

Reputation: 21279

The only (quite quirky) workaround for what you are trying to do is to log on some other user account on the side which has access to the domain and can thus query user details (don't remember the permissions needed in detail, though). Otherwise I'd suggest you go with Gregg's answer.

With a thread impersonated as such user you should then be able to query the information for the user that you are going to log on (how do you even know by that time?) via NetUserGetInfo() and friends. Choose the USER_INFO_* struct that best suits your needs and simply ask the domain server for the information. This should also work on earlier and later systems (the functionality, not the GINA itself).

Upvotes: 0

Related Questions