End-user account info from Active Directory for Windows network login

Relevant links:

This is sample code. Add error handling and adjust to your requirements as necessary.

loAdUser = ADUserInfo()
 
? "cn:", loAdUser.cn
? "department:", loAdUser.department
? "displayname:", loAdUser.displayName
? "fax:", loAdUser.facsimileTelephoneNumber
? "emailaddr:", loAdUser.mail
? "lastname:", loAdUser.sn
? "firstName:", loAdUser.givenName
? "telephone:", loAdUser.telephoneNumber
? "dn:", loAdUser.distinguishedName
? "upn:", loAdUser.userPrincipalName
? "title:", loAdUser.title
 
? "last logon (UTC):", ConvertADoffset2UtcTime(loAdUser.lastlogon)
? "account expires (UTC):", ConvertADoffset2UtcTime(loAdUser.accountexpires)
* Retrieve ADUser info for Windows Login 
FUNCTION ADUserInfo
LPARAMETERS tcUserName, tcUserDomain
LOCAL lcUserName, lcCurrentUserName, lcCurrentUserDomain, lcUserDomain, loNameTrans, lcDN, loAdUser
#DEFINE ADS_NAME_INITTYPE_GC  3
#DEFINE ADS_NAME_TYPE_NT4 	3
#DEFINE ADS_NAME_TYPE_1779 	1
 
lcCurrentUserName = GETENV("UserName")
lcCurrentUserDomain = GETENV("UserDomain")
 
* If parameters are not supplied, use current user login info
lcUserName = EVL(tcUserName, lcCurrentUserName)
lcUserDomain = EVL(tcUserDomain, lcCurrentUserDomain)
 
* Use NameTranslate object to get DN based on Windows Login Name
loNameTrans = CREATEOBJECT("NameTranslate")					
loNameTrans.Init( ADS_NAME_INITTYPE_GC, "")
TRY
	loNameTrans.Set(ADS_NAME_TYPE_NT4, lcUserDomain + "\" + lcUserName)
	lcDN = loNameTrans.Get(ADS_NAME_TYPE_1779)
	loAdUser = GETOBJECT("LDAP://" + lcDN)
CATCH TO oExp WHEN oExp.Errorno = 1426
	loAdUser = Null
ENDTRY	
 
RETURN loAdUser
* 64-bit integer as a number 
FUNCTION ConvertADsLargeInteger(toADsLargeInteger)
RETURN toADsLargeInteger.HighPart * (2^32) + IIF(toADsLargeInteger.LowPart < 0, 2^32, 0) + toADsLargeInteger.LowPart
 
* UTC Time from AD offset.
FUNCTION ConvertADoffset2UtcTime(toADsLargeInteger)
LOCAL lnSecondsOffset
* Offset is from 1601-01-01 in 100 nanoseconds
lnSecondsOffset = INT(ConvertADsLargeInteger(toADsLargeInteger) / 10^7)
IF lnSecondsOffset > 265046774399 
	* The date will be bigger than > 9999-12-31 23:59:59
	lnSecondsOffset = NULL
ENDIF	
 
RETURN CAST(DATETIME(1601, 01, 01) + lnSecondsOffset AS datetime)
Your rating: None Average: 5 (1 vote)

Thank you. This is very

Thank you. This is very helpful!