Attaching w_Login.txt (rename this to .srw) and n_cst_Login.txt (rename this to .sru) with options to perform LDAP and Active Directory logins. The code is exported from PowerBuilder 2017 for forward compatibility during import into later versions. The login window is implemented using non-intrusive status messages for better UX.
Once login is successful using network creds, go ahead and connect to the dB implicitly using a common dB User with sufficient privileges (especially useful in 3-Tier PowerServer apps and SSO).
If you make too many unsuccessful login attempts, you could get locked out of Windows!
For 2-Tier dB login, you could disable the Domain SLE (or replace it with a DDLB of databases) and use the Username and Password fields to directly log into the dB by altering some logic in of_Login().
On PowerBuilder 2022, window size is messed up - re-align the controls and status bar as needed.
Ignore the functions starting with xf_* or discard them.
There is a Themes DDLB too on the login screen - uncomment the ApplyTheme() call in of_ApplyTheme() if using PowerBuilder 2019 or later, if needed.
Assign logo, image and modify the Copyright text.
For people with color blindness, adjust the UI colors.
Hello Appeon, we cannot attach .srw or .sru or any PowerBuilder source files? Not even TXT files?
N_CST_LOGIN
$PBExportHeader$n_cst_login.sru
$PBExportComments$SHEKAR
forward
global type n_cst_login from nonvisualobject
end type
end forward
global type n_cst_login from nonvisualobject autoinstantiate
end type
type prototypes
// This function gets the network login userid
//Function ulong WNetGetUser(string lpname, ref string lpusername, ref ulong buflen) Library "mpr.dll" Alias For "WNetGetUserA;Ansi"
// This function validates the login userid/password
Function boolean LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, ulong dwLogonType, ulong dwLogonProvider, ref ulong phToken) Library "advapi32.dll" Alias For "LogonUserA;Ansi"
//Function boolean LogonUserEx(string lpszUsername, string lpszDomain, string lpszPassword, ulong dwLogonType, ulong dwLogonProvider, ref ulong phToken) Library "advapi32.dll" Alias For "LogonUserExA;Ansi"
// Close the connection
Function boolean CloseHandle(ulong hObject) Library "kernel32.dll"
end prototypes
type variables
CONSTANT ULong LOGON32_LOGON_NETWORK = 3
CONSTANT ULong LOGON32_PROVIDER_DEFAULT = 0
//
CONSTANT integer C_LOGIN_SUCCESS = 1
CONSTANT integer C_LOGIN_FAILURE = 0
CONSTANT integer C_LOGIN_ERROR_USERNAME = -1
CONSTANT integer C_LOGIN_ERROR_PASSWORD = -2
CONSTANT integer C_LOGIN_ERROR_DOMAIN = -3
//
CONSTANT string C_LOGIN_SUCCESS_MESSAGE = "Login successful"
CONSTANT string C_LOGIN_FAILURE_MESSAGE = "Incorrect Username or Password"
CONSTANT string C_LOGIN_ERROR_USERNAME_MESSAGE = "Username cannot be blank"
CONSTANT string C_LOGIN_ERROR_PASSWORD_MESSAGE = "Password cannot be blank"
CONSTANT string C_LOGIN_ERROR_DOMAIN_MESSAGE = "Domain cannot be blank"
end variables
forward prototypes
public function integer of_loginad (string as_username, string as_password, string as_domain)
public function integer of_loginldap (string as_username, string as_password, string as_domain)
public function integer of_getdetails (ref string as_username, ref string as_domain, ref string as_computername)
public function string xf_getdomain ()
public function string xf_getusername ()
public function integer of_validate (string as_username, string as_password, string as_domain)
public function integer xf_validate (string as_username, string as_password, string as_domain)
end prototypes
public function integer of_loginad (string as_username, string as_password, string as_domain);// SHEKAR - ActiveDirectory Authentication
uLong lul_Result, lul_BufferLength, lul_Token
integer li_Return
boolean lb_Result
//
li_Return = of_Validate( as_Username, as_Password, as_Domain )
//
IF li_Return <= 0 THEN
RETURN li_Return // Error with credentials
END IF
//
lb_Result = LogonUser( as_Username, as_Domain, as_Password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, lul_Token )
//
IF lb_Result THEN
CloseHandle( lul_Token )
RETURN C_LOGIN_SUCCESS // Login Success
END IF
//
RETURN C_LOGIN_FAILURE // Login Failure
end function
public function integer of_loginldap (string as_username, string as_password, string as_domain);// // SHEKAR - LDAP Authentication
uLong lul_Result, lul_BufferLength, lul_Token
integer li_Return
boolean lb_result
string ls_Code, ls_Eval
OLEObject ole_Wsh
//
li_Return = of_Validate( as_Username, as_Password, as_Domain )
//
IF li_Return <= 0 THEN
RETURN li_Return
END IF
//
// Define VBScript
ls_Code = 'Function Logon()~r~n' &
+ 'const ADS_SECURE_AUTHENTICATION = &h0001~r~n' &
+ 'const ADS_CHASE_REFERRALS_ALWAYS = &H60~r~n' &
+ 'strDomain = "' + as_Domain + '"~r~n' &
+ 'strUserID = "' + as_Username + '"~r~n' &
+ 'strUserPWD = "' + as_Password + '"~r~n' &
+ 'strPath = "LDAP://" & strDomain & "/OU=Users,DC=" & strDomain~r~n' &
+ 'On Error Resume Next~r~n' &
+ 'set objDSO = GetObject("LDAP:")~r~n' &
+ 'set objUser = objDSO.OpenDSObject(strPath, strUserID, strUserPWD, ADS_SECURE_AUTHENTICATION OR ADS_CHASE_REFERRALS_ALWAYS)~r~n' &
+ 'if Err.Number <> 0 then~r~n' &
+ ' Logon = False~r~n' &
+ 'else~r~n' &
+ ' Logon = True~r~n' &
+ 'end if~r~n' &
+ 'Err.Clear~r~n' &
+ 'On Error Goto 0~r~n' &
+ 'set objDSO = Nothing~r~n' &
+ 'set objUser = Nothing~r~n' &
+ 'end function'
//
li_Return = C_LOGIN_FAILURE // Init - Login failure
//
TRY
//
ole_Wsh = CREATE OLEObject
ole_Wsh.ConnectToNewObject( 'MSScriptControl.ScriptControl' )
//
// Set the VBScript
ole_Wsh.Language = 'VBScript'
ole_Wsh.AddCode( ls_Code )
//
// Run the function
ls_Eval = Lower( String( ole_Wsh.Eval( 'Logon' )))
//
IF ls_Eval = 'true' THEN
li_Return = C_LOGIN_SUCCESS
// GOTO HELL
END IF
//
CATCH ( Exception e )
MessageBox( 'Error', e.GetMessage())
END TRY
//
//////////////////////////
//HELL:
//////////////////////////
ole_Wsh.DisconnectObject()
DESTROY ole_Wsh
GarbageCollect()
//
RETURN li_Return
end function
public function integer of_getdetails (ref string as_username, ref string as_domain, ref string as_computername);// SHEKAR - Get Network details
integer li_Result
OLEObject ole_Wsh
//
ole_Wsh = CREATE OLEObject
li_Result = ole_Wsh.ConnectToNewObject( 'WScript.Network' )
//
IF li_Result = 0 THEN
as_Username = ole_Wsh.UserName
as_Domain = ole_Wsh.UserDomain
as_ComputerName = ole_Wsh.ComputerName
END IF
//
ole_Wsh.DisconnectObject()
DESTROY ole_Wsh
GarbageCollect()
//
RETURN li_Result
/*
oleobject ads
string ls_stuff
ads = CREATE OleObject
ads.ConnectToNewObject( "ADSystemInfo" )
ls_stuff = 'User: ' + String(ads.UserName)
ls_stuff += '~n~r' + 'Computer: ' + string(ads.ComputerName)
ls_stuff += '~n~r' + 'Domain: ' + string(ads.DomainDNSName)
ls_stuff += '~n~r' + 'Domain short: ' + string(ads.DomainShortName)
ls_stuff += '~n~r' + 'Forest: ' + string(ads.ForestDNSName)
ls_stuff += '~n~r' + 'Native Mode: ' + string(ads.IsNativeMode)
ls_stuff += '~n~r' + 'PDCRoleOwner: ' + string(ads.PDCRoleOwner)
ls_stuff += '~n~r' + 'SchemaRoleOwner: ' + string(ads.SchemaRoleOwner)
ls_stuff += '~n~r' + 'Site: ' + string(ads.SiteName)
MessageBox("Active Directory - Information",ls_stuff)
DESTROY(ads)
------
ADSystemInfo interface defines the following properties. All are read only
ComputerName
Retrieves the distinguished name of the local computer.
DomainDNSName
Retrieves the DNS name of the local computer domain, for example “example.fabrikam.com”.
DomainShortName
Retrieves the short name of the local computer domain, for example “myDom”.
ForestDNSName
Retrieves the DNS name of the local computer forest.
IsNativeMode
Determines whether the local computer domain is in native or mixed mode.
PDCRoleOwner
Retrieves the distinguished name of the NTDS-DSA object for the DC that owns the primary domain controller role in the local computer domain.
SchemaRoleOwner
Retrieves the distinguished name of the NTDS-DSA object for the DC that owns the schema role in the local computer forest.
SiteName
Retrieves the site name of the local computer.
UserName
Retrieves the Active Directory distinguished name of the current user, which is the logged-on user or the user impersonated by the calling thread.
*/
end function
public function string xf_getdomain ();string ls_Domain
OLEObject LDAP
//
// Connect to ActiveDirectory
LDAP = CREATE OLEObject
LDAP.ConnectToNewObject( "ADSystemInfo" )
//*/
// Get the Domain
TRY
ls_Domain = String( LDAP.DomainDNSName )
CATCH ( Exception e )
MessageBox( 'Error', e.GetMessage())
ls_Domain = ''
END TRY
//
LDAP.DisconnectObject()
DESTROY LDAP
GarbageCollect()
//
RETURN ls_Domain
/*
FUNCTION long GetEnvironmentVariableA(string varname,REF
string lpszResultBuffer,long nBufferSize) LIBRARY
'kernel32.dll'
Put the following code wherever you want to :
string s_env
Long ll_ret
string s_buffer
Long ll_size
s_env = "USERDNSDOMAIN"
s_buffer= space(256)
ll_size= 50
ll_ret= GetEnvironmentVariableA(s_env, s_buffer, ll_size)
MessageBox("USERDNSDOMAIN",s_buffer)
=====================================
OLEObject l_ole
int li_rc
string ls_domain, ls_user, ls_site, ls_computername
l_ole = CREATE OLEObject
li_rc = l_ole.ConnectToNewObject( "ADSystemInfo")
IF li_rc = 0 THEN
ls_computername = l_ole.computername //CN=CAL26040,OU=Computers,OU=calgary,DC=forestoil,DC=com
ls_site = l_ole.sitename // calgary
ls_user = l_ole.username // CN=Terry Dykstra(tddykstra),OU=Users,OU=calgary,DC=forestoil,DC=com
ls_domain = l_ole.domaindnsname // forestoil.com
END IF
l_ole.DisConnectObject()
DESTROY l_ole
*/
end function
public function string xf_getusername ();string ls_Username
uLong lul_Result, lul_BufferLength
//
// Get the username
lul_BufferLength = 32
ls_Username = Space( lul_BufferLength )
//lul_Result = WNetGetUser( '', ls_Username, lul_BufferLength )
//
IF lul_Result = 0 THEN
RETURN ls_Username
END IF
//
RETURN ''
/*
PUBLIC FUNCTION Boolean GetUserNameA(REF string user, REF ulong size)
LIBRARY "ADVAPI32.DLL"
Power Script:
ulong lul_size = 255
string ls_username = space(lul_size)
IF NOT GetUserNameA( ls_username, lul_size) THEN
SetNull(ls_username)
END IF
RETURN ls_username
*/
end function
public function integer of_validate (string as_username, string as_password, string as_domain);// SHEKAR - LDAP Authentication
string ls_User, ls_Dom, ls_Computer
boolean lb_Invoked
//
as_Username = Trim( as_Username )
as_Domain = Trim( as_Domain )
// NO TRIMMING of the as_Password
//
// Validate login creds
IF IsNull( as_Username ) OR as_Username = '' THEN
RETURN C_LOGIN_ERROR_USERNAME // No Username
ELSEIF IsNull( as_Password ) OR as_Password = '' THEN
RETURN C_LOGIN_ERROR_PASSWORD // No Password
ELSEIF IsNull( as_Domain ) OR as_Domain = '' THEN
RETURN C_LOGIN_ERROR_DOMAIN // No Domain
END IF
//
RETURN 1 // All clear
end function
public function integer xf_validate (string as_username, string as_password, string as_domain);// SHEKAR - LDAP Authentication
string ls_User, ls_Dom, ls_Computer
boolean lb_Invoked
//
IF IsNull( as_Password ) OR as_Password = '' THEN
RETURN C_LOGIN_ERROR_PASSWORD // No password
END IF
//
as_Username = Trim( as_Username )
as_Domain = Trim( as_Domain )
//
// Get the username
IF IsNull( as_Username ) OR as_Username = '' THEN
//
RETURN C_LOGIN_ERROR_USERNAME // Username error
/*
of_GetDetails( ls_User, ls_Dom, ls_Computer )
lb_Invoked = TRUE
as_Username = ls_User
//
IF as_Username = '' THEN
RETURN C_LOGIN_ERROR_USERNAME // Username error
END IF
*/
//
END IF
//
// Get the Domain
IF IsNull( as_Domain ) OR as_Domain = '' THEN
//
RETURN C_LOGIN_ERROR_DOMAIN // Domain error
/*
IF NOT lb_Invoked THEN
of_GetDetails( ls_User, ls_Dom, ls_Computer )
lb_Invoked = TRUE
END IF
//
as_Domain = ls_Dom
//
IF as_Domain = '' THEN
RETURN C_LOGIN_ERROR_DOMAIN // Domain error
END IF
*/
//
END IF
//
RETURN 1 // All clear
/*
IF as_Password = '' THEN
RETURN -2 // No password
END IF
//
// Get the username
IF as_Username = '' THEN
//
as_Username = of_GetUsername()
//
IF as_Username = '' THEN
RETURN -1 // Username error
END IF
//
END IF
//
// Get the Domain
IF as_Domain = '' THEN
//
as_Domain = of_GetDomain()
//
IF as_Domain = '' THEN
RETURN -3 // Domain error
END IF
//
END IF
//
RETURN 1 // All clear
*/
end function
on n_cst_login.create
call super::create
TriggerEvent( this, "constructor" )
end on
on n_cst_login.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on
W_LOGIN
$PBExportHeader$w_login.srw
$PBExportComments$SHEKAR
forward
global type w_login from window
end type
type cbx_showpassword from checkbox within w_login
end type
type cb_resetdomain from commandbutton within w_login
end type
type cb_username from commandbutton within w_login
end type
type ddlb_theme from dropdownlistbox within w_login
end type
type st_4 from statictext within w_login
end type
type st_status from statictext within w_login
end type
type mle_copyright from multilineedit within w_login
end type
type p_logo from picture within w_login
end type
type p_login from picture within w_login
end type
type cb_ad from commandbutton within w_login
end type
type cb_cancel from commandbutton within w_login
end type
type st_3 from statictext within w_login
end type
type sle_domain from singlelineedit within w_login
end type
type st_2 from statictext within w_login
end type
type st_1 from statictext within w_login
end type
type sle_password from singlelineedit within w_login
end type
type sle_username from singlelineedit within w_login
end type
type cb_ldap from commandbutton within w_login
end type
type ln_1 from line within w_login
end type
type ln_2 from line within w_login
end type
type ln_3 from line within w_login
end type
type ln_4 from line within w_login
end type
end forward
global type w_login from window
integer width = 2039
integer height = 1160
boolean titlebar = true
string title = "Login"
windowtype windowtype = response!
long backcolor = 67108864
string icon = "AppIcon!"
boolean center = true
cbx_showpassword cbx_showpassword
cb_resetdomain cb_resetdomain
cb_username cb_username
ddlb_theme ddlb_theme
st_4 st_4
st_status st_status
mle_copyright mle_copyright
p_logo p_logo
p_login p_login
cb_ad cb_ad
cb_cancel cb_cancel
st_3 st_3
sle_domain sle_domain
st_2 st_2
st_1 st_1
sle_password sle_password
sle_username sle_username
cb_ldap cb_ldap
ln_1 ln_1
ln_2 ln_2
ln_3 ln_3
ln_4 ln_4
end type
global w_login w_login
type prototypes
// This function gets the network login userid
Function ulong WNetGetUser(string lpname, ref string lpusername, ref ulong buflen) Library "mpr.dll" Alias For "WNetGetUserA;Ansi"
// This function validates the login userid/password
Function boolean LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, ulong dwLogonType, ulong dwLogonProvider, ref ulong phToken) Library "advapi32.dll" Alias For "LogonUserA;Ansi"
//Function boolean LogonUserEx(string lpszUsername, string lpszDomain, string lpszPassword, ulong dwLogonType, ulong dwLogonProvider, ref ulong phToken) Library "advapi32.dll" Alias For "LogonUserExA;Ansi"
// Close the connection
Function boolean CloseHandle(ulong hObject) Library "kernel32.dll"
end prototypes
type variables
// SHEKAR - LDAP Authentication
CONSTANT long C_COLOR_RED = RGB( 192, 0, 0 )
CONSTANT long C_COLOR_GREEN = RGB( 0, 128, 0 )
CONSTANT long C_COLOR_YELLOW = RGB( 255, 255, 0 )
//
n_cst_Login inv_Login
string is_Theme
string is_Username, is_Domain, is_Computer
end variables
forward prototypes
public function integer of_login (string as_type)
public function integer of_applytheme ()
end prototypes
public function integer of_login (string as_type);// SHEKAR - LDAP Authentication
integer li_Result
long ll_Color
string ls_Username, ls_Password, ls_Domain, ls_Message
singleLineEdit lsle_Control
//
SetPointer( HourGlass! )
as_Type = Upper( Trim( as_Type ))
//
IF as_Type = '' THEN
as_Type = 'LDAP'
END IF
//
ls_Username = sle_Username.Text
ls_Password = sle_Password.Text
ls_Domain = sle_Domain.Text
//
st_Status.Text = " Please wait..."
st_Status.TextColor = 0 // Black
st_Status.BackColor = C_COLOR_YELLOW
//
IF as_Type = 'LDAP' THEN
li_Result = inv_Login.of_LoginLDAP( ls_Username, ls_Password, ls_Domain )
ELSEIF as_Type = 'AD' THEN
li_Result = inv_Login.of_LoginAD( ls_Username, ls_Password, ls_Domain )
ELSE
li_Result = inv_Login.C_LOGIN_FAILURE
END IF
//
IF li_Result > 0 THEN // 1
ll_Color = C_COLOR_GREEN
ls_Message = inv_Login.C_LOGIN_SUCCESS_MESSAGE
// TODO: Go ahead and login into the database "implicitly", now...
ELSE
//
Beep( 1 ) // Audible error
ll_Color = C_COLOR_RED
//
IF li_Result = inv_Login.C_LOGIN_ERROR_USERNAME THEN // -1
ls_Message = inv_Login.C_LOGIN_ERROR_USERNAME_MESSAGE
lsle_Control = sle_Username
ELSEIF li_Result = inv_Login.C_LOGIN_ERROR_PASSWORD THEN // -2
ls_Message = inv_Login.C_LOGIN_ERROR_PASSWORD_MESSAGE
lsle_Control = sle_Password
ELSEIF li_Result = inv_Login.C_LOGIN_ERROR_DOMAIN THEN // -3
ls_Message = inv_Login.C_LOGIN_ERROR_DOMAIN_MESSAGE
lsle_Control = sle_Domain
ELSE // 0
ls_Message = inv_Login.C_LOGIN_FAILURE_MESSAGE
lsle_Control = sle_Username
END IF
//
END IF
//
st_Status.Text = ' ' + ls_Message
st_Status.BackColor = ll_Color
st_Status.TextColor = C_COLOR_YELLOW
//
// Set focus to the right edit control for user-friendliness :)
IF IsValid( lsle_Control ) THEN
lsle_Control.SetFocus()
END IF
//
RETURN li_Result
end function
public function integer of_applytheme ();// SHEKAR - UI Themes
// Valid values: dark, blue, grey or gray, silver
// gnv_App.of_GetTheme()
// Upper( Trim( ProfileString( gnv_App.is_IniFile, 'GENERAL','THEME', '' )))
is_Theme = Upper( Trim( ddlb_Theme.Text )) // Or populate the DDLB with Theme folder names
//
IF is_Theme = 'DARK' THEN
is_Theme = 'Flat Design Dark'
ELSEIF is_Theme = 'BLUE' THEN
is_Theme = 'Flat Design Blue'
ELSEIF is_Theme = 'GREY' OR is_Theme = 'GRAY' THEN
is_Theme = 'Flat Design Grey'
ELSEIF is_Theme = 'SILVER' THEN
is_Theme = 'Flat Design Silver'
ELSE
is_Theme = '' // System
END IF
//
// gnv_App.of_SetTheme( is_Theme )
// Upper( Trim( SetProfileString( gnv_App.is_IniFile, 'GENERAL','THEME', is_Theme )))
//
//RETURN ApplyTheme( is_Theme ) // Uncomment for PowerBuilder 2019 and above
RETURN 1
end function
on w_login.create
this.cbx_showpassword=create cbx_showpassword
this.cb_resetdomain=create cb_resetdomain
this.cb_username=create cb_username
this.ddlb_theme=create ddlb_theme
this.st_4=create st_4
this.st_status=create st_status
this.mle_copyright=create mle_copyright
this.p_logo=create p_logo
this.p_login=create p_login
this.cb_ad=create cb_ad
this.cb_cancel=create cb_cancel
this.st_3=create st_3
this.sle_domain=create sle_domain
this.st_2=create st_2
this.st_1=create st_1
this.sle_password=create sle_password
this.sle_username=create sle_username
this.cb_ldap=create cb_ldap
this.ln_1=create ln_1
this.ln_2=create ln_2
this.ln_3=create ln_3
this.ln_4=create ln_4
this.Control[]={this.cbx_showpassword,&
this.cb_resetdomain,&
this.cb_username,&
this.ddlb_theme,&
this.st_4,&
this.st_status,&
this.mle_copyright,&
this.p_logo,&
this.p_login,&
this.cb_ad,&
this.cb_cancel,&
this.st_3,&
this.sle_domain,&
this.st_2,&
this.st_1,&
this.sle_password,&
this.sle_username,&
this.cb_ldap,&
this.ln_1,&
this.ln_2,&
this.ln_3,&
this.ln_4}
end on
on w_login.destroy
destroy(this.cbx_showpassword)
destroy(this.cb_resetdomain)
destroy(this.cb_username)
destroy(this.ddlb_theme)
destroy(this.st_4)
destroy(this.st_status)
destroy(this.mle_copyright)
destroy(this.p_logo)
destroy(this.p_login)
destroy(this.cb_ad)
destroy(this.cb_cancel)
destroy(this.st_3)
destroy(this.sle_domain)
destroy(this.st_2)
destroy(this.st_1)
destroy(this.sle_password)
destroy(this.sle_username)
destroy(this.cb_ldap)
destroy(this.ln_1)
destroy(this.ln_2)
destroy(this.ln_3)
destroy(this.ln_4)
end on
event open;// SHEKAR - LDAP Authentication
string ls_Username, ls_Domain, ls_Computer, ls_Copyright
//
ls_Copyright = mle_Copyright.Text
ls_Copyright = Mid( ls_Copyright, 7 )
ls_Copyright = '© ' + String( Year( Today())) + ls_Copyright
mle_Copyright.Text = ls_Copyright
//
inv_Login.of_GetDetails( is_Username, is_Domain, is_Computer )
//
// Initialize fields and set focus
sle_Username.Text = is_Username
sle_Domain.Text = is_Domain
//
IF sle_Username.Text <> "" THEN
sle_Password.SetFocus()
END IF
/*
// Initialize fields and set focus
sle_Username.Text = inv_Login.of_GetUsername()
sle_Domain.Text = inv_Login.of_GetDomain()
//
IF sle_Username.Text <> "" THEN
sle_Password.SetFocus()
END IF
*/
end event
type cbx_showpassword from checkbox within w_login
integer x = 1746
integer y = 224
integer width = 201
integer height = 68
integer taborder = 40
integer textsize = -8
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
string text = "Show"
end type
event clicked;// SHEKAR
sle_Password.Password = ( NOT This.Checked)
end event
type cb_resetdomain from commandbutton within w_login
integer x = 1742
integer y = 352
integer width = 201
integer height = 80
integer taborder = 60
integer textsize = -8
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "Reset"
end type
event clicked;// SHEKAR
sle_Domain.Text = is_Domain
end event
type cb_username from commandbutton within w_login
integer x = 1742
integer y = 88
integer width = 201
integer height = 80
integer taborder = 20
integer textsize = -8
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "Reset"
end type
event clicked;// SHEKAR
sle_Username.Text = is_Username
end event
type ddlb_theme from dropdownlistbox within w_login
integer x = 1673
integer y = 876
integer width = 288
integer height = 596
integer taborder = 100
integer textsize = -8
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "MS Sans Serif"
long textcolor = 33554432
boolean sorted = false
string item[] = {"System","Dark","Blue","Gray","Silver"}
borderstyle borderstyle = stylelowered!
end type
event selectionchanged;of_ApplyTheme()
end event
type st_4 from statictext within w_login
integer x = 1714
integer y = 804
integer width = 251
integer height = 60
integer textsize = -8
integer weight = 700
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "MS Sans Serif"
long textcolor = 33554432
long backcolor = 67108864
string text = "THEME"
boolean focusrectangle = false
end type
type st_status from statictext within w_login
integer x = 9
integer y = 996
integer width = 2011
integer height = 76
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 65535
long backcolor = 67108864
boolean focusrectangle = false
end type
type mle_copyright from multilineedit within w_login
integer x = 46
integer y = 808
integer width = 1623
integer height = 180
integer textsize = -8
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Small Fonts"
long textcolor = 33554432
long backcolor = 67108864
boolean enabled = false
string text = "© 2022 PowerObject. All rights reserved."
boolean border = false
borderstyle borderstyle = stylelowered!
end type
type p_logo from picture within w_login
integer x = 69
integer y = 588
integer width = 457
integer height = 104
boolean focusrectangle = false
end type
type p_login from picture within w_login
integer width = 590
integer height = 768
boolean focusrectangle = false
end type
type cb_ad from commandbutton within w_login
integer x = 1106
integer y = 588
integer width = 402
integer height = 112
integer taborder = 80
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "AD"
end type
event clicked;// SHEKAR - LDAP Authentication
RETURN of_Login( 'AD' )
end event
type cb_cancel from commandbutton within w_login
integer x = 1550
integer y = 588
integer width = 402
integer height = 112
integer taborder = 90
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "Cancel"
boolean cancel = true
end type
event clicked;// SHEKAR - LDAP Authentication
CloseWithReturn( Parent, -1 )
end event
type st_3 from statictext within w_login
integer x = 667
integer y = 356
integer width = 325
integer height = 64
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
long backcolor = 67108864
string text = "Domain:"
boolean focusrectangle = false
end type
type sle_domain from singlelineedit within w_login
integer x = 992
integer y = 344
integer width = 960
integer height = 96
integer taborder = 50
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
borderstyle borderstyle = stylelowered!
end type
type st_2 from statictext within w_login
integer x = 667
integer y = 224
integer width = 325
integer height = 64
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
long backcolor = 67108864
string text = "Password:"
boolean focusrectangle = false
end type
type st_1 from statictext within w_login
integer x = 667
integer y = 88
integer width = 325
integer height = 64
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
long backcolor = 67108864
string text = "Username:"
boolean focusrectangle = false
end type
type sle_password from singlelineedit within w_login
integer x = 992
integer y = 212
integer width = 960
integer height = 96
integer taborder = 30
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
boolean password = true
borderstyle borderstyle = stylelowered!
end type
type sle_username from singlelineedit within w_login
integer x = 992
integer y = 80
integer width = 960
integer height = 96
integer taborder = 10
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
long textcolor = 33554432
borderstyle borderstyle = stylelowered!
end type
type cb_ldap from commandbutton within w_login
integer x = 667
integer y = 588
integer width = 402
integer height = 112
integer taborder = 70
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Tahoma"
string text = "LDAP"
boolean default = true
end type
event clicked;// SHEKAR - LDAP Authentication
RETURN of_Login( 'LDAP' )
end event
type ln_1 from line within w_login
long linecolor = 268435456
integer linethickness = 4
integer beginx = -50
integer beginy = 516
integer endx = 2098
integer endy = 516
end type
type ln_2 from line within w_login
long linecolor = 33554432
integer linethickness = 4
integer beginx = 585
integer beginy = -16
integer endx = 585
integer endy = 768
end type
type ln_3 from line within w_login
long linecolor = 134217749
integer linethickness = 4
integer beginx = -59
integer beginy = 768
integer endx = 2089
integer endy = 768
end type
type ln_4 from line within w_login
long linecolor = 134217744
integer linethickness = 4
integer beginx = -50
integer beginy = 992
integer endx = 2075
integer endy = 992
end type
If executing over a file-server, it could be slow as usual. It is not the issue with the login logic. Run your app using a local copy of the app. Did you try running the attached app from your local machine?
If using PowerClient, the app gets sync'ed to your local machine and should be quick too.
If using PowerServer, only the backend logic gets ported into C# and deployed on to the app server. All UI logic (including LDAP/AD login) remains inside the client app and should be quick as well. Once you authenticate using Windows creds, you just connect to the dB using a common user and password (the end users won't know these dB creds stored on the app server and this logic gets deployed on to the app server)