Files
carparkvalidation/CommonAD/ADStaffLink.cs
T
2026-06-18 21:39:20 +10:00

374 lines
17 KiB
C#

using CommonAD.Models;
using System;
using System.Collections.Generic;
using System.DirectoryServices;
namespace CommonAD
{
public class ADStaffLink
{
private ADConfig _adConfig;
public ADStaffLink (ADConfig adConfig)
{
_adConfig = adConfig;
}
public MyADObject SearchStaff(string FirstName = "", string LastName = "")
{
MyADObject ADObj = new MyADObject();
using (var DE = new System.DirectoryServices.DirectoryEntry(_adConfig.LDAPPath, _adConfig.LDAPUser, _adConfig.LDAPPassword))
{
try
{
DirectorySearcher adsSearcher = new DirectorySearcher(DE);
adsSearcher.ClientTimeout = _adConfig.ADTimeOut;
adsSearcher.ServerTimeLimit = _adConfig.ADTimeOut;
adsSearcher.ServerPageTimeLimit = _adConfig.ADTimeOut;
adsSearcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(givenname={0})(sn={1}))", FirstName, LastName);
try
{
SearchResult sr = adsSearcher.FindOne();
if (sr != null)
{
ADObj.result = true;
//LoginResult.Login = GetUserPropertyValue(sr, "sAMAccountName", 0);
ADObj.StafflinkNo = GetUserPropertyValue(sr, "sAMAccountName", 0);
ADObj.FirstName = GetUserPropertyValue(sr, "givenname", 0);
ADObj.LastName = GetUserPropertyValue(sr, "sn", 0);
ADObj.Email = GetUserPropertyValue(sr, "mail", 0);
ADObj.Company = GetUserPropertyValue(sr, "company", 0);
ADObj.Location = GetUserPropertyValue(sr, "physicalDeliveryOfficeName", 0);
ADObj.Department = GetUserPropertyValue(sr, "department", 0);
ADObj.BadPwdCount = GetUserPropertyValue(sr, "badPwdCount", 0);
ADObj.Phone = GetUserPropertyValue(sr, "telephonenumber", 0);
ADObj.DisplayName = GetUserPropertyValue(sr, "displayName", 0);
ADObj.Manager = GetUserPropertyValue(sr, "manager", 0);
ADObj.ReportsTo = GetUserPropertyValue(sr, "directReports", 0);
ADObj.StaffList = GetUserPropertyValue(sr, "staffList", 0);
}
}
catch
{
// Failed to authenticate. Most likely it is caused by unknown user
// id or bad strPassword.
ADObj.result = false;
}
}
catch
{
ADObj.result = false;
}
}
//LoginResult.Success = res;
//string token = "";
//long tickTock = DateTime.Now.Ticks;
//if (res)
//{
// string tokenPT = app + "|" + user + "|" + "|" + tickTock + "|" + "NBM";
// token = CommonCrypt.EncryptString(tokenPT, "bagmas2011+", "a1b2c3d4");
// token = CommonEncoding.Base64Encode(token);
//}
//LoginResult.Login = user;
//LoginResult.Token = token;
//LoginResult.Time = tickTock;
return ADObj;
}
public MyADObject SearchStaff(string StaffLinkNo)
{
MyADObject ADObj = new MyADObject();
using (var DE = new System.DirectoryServices.DirectoryEntry(_adConfig.LDAPPath, _adConfig.LDAPUser, _adConfig.LDAPPassword))
{
try
{
DirectorySearcher adsSearcher = new DirectorySearcher(DE);
adsSearcher.ClientTimeout = _adConfig.ADTimeOut;
adsSearcher.ServerTimeLimit = _adConfig.ADTimeOut;
adsSearcher.ServerPageTimeLimit = _adConfig.ADTimeOut;
adsSearcher.Filter = "(SAMAccountName=" + StaffLinkNo + ")";
try
{
SearchResult sr = adsSearcher.FindOne();
if (sr != null)
{
ADObj.result = true;
// LoginResult.Login = GetUserPropertyValue(sr, "sAMAccountName", 0); ;
ADObj.StafflinkNo = GetUserPropertyValue(sr, "SAMAccountName", 0);
ADObj.FirstName = GetUserPropertyValue(sr, "givenname", 0);
ADObj.LastName = GetUserPropertyValue(sr, "sn", 0);
ADObj.Email = GetUserPropertyValue(sr, "mail", 0);
ADObj.Company = GetUserPropertyValue(sr, "company", 0);
ADObj.Location = GetUserPropertyValue(sr, "physicalDeliveryOfficeName", 0);
ADObj.Department = GetUserPropertyValue(sr, "department", 0);
ADObj.JobTitle = GetUserPropertyValue(sr, "title", 0);
ADObj.BadPwdCount = GetUserPropertyValue(sr, "badPwdCount", 0);
ADObj.Phone = GetUserPropertyValue(sr, "telephonenumber", 0);
ADObj.DisplayName = GetUserPropertyValue(sr, "displayName", 0);
ADObj.Manager = GetUserPropertyValue(sr, "manager", 0);
ADObj.ReportsTo = GetUserPropertyValue(sr, "directReports", 0);
ADObj.StaffList = GetUserPropertyValue(sr, "staffList", 0);
}
}
catch (Exception ex)
{
// Failed to authenticate. Most likely it is caused by unknown user
// id or bad strPassword.
ADObj.result = false;
}
}
catch
{
ADObj.result = false;
}
}
//LoginResult.Success = res;
//string token = "";
//long tickTock = DateTime.Now.Ticks;
//if (res)
//{
// string tokenPT = app + "|" + user + "|" + "|" + tickTock + "|" + "NBM";
// token = CommonCrypt.EncryptString(tokenPT, "bagmas2011+", "a1b2c3d4");
// token = CommonEncoding.Base64Encode(token);
//}
//LoginResult.Login = user;
//LoginResult.Token = token;
//LoginResult.Time = tickTock;
return ADObj;
}
public MyADObject CheckADCredentials(string user, string pass)
{
//dynamic LoginResult = new JObject() as dynamic;
bool res = true;
MyADObject ADObj = new MyADObject();
using (var DE = new System.DirectoryServices.DirectoryEntry(_adConfig.LDAPPath, user, pass))
{
try
{
//DE.RefreshCache(); // This will force credentials validation
DirectorySearcher adsSearcher = new DirectorySearcher(DE);
adsSearcher.ClientTimeout = _adConfig.ADTimeOut;
adsSearcher.ServerTimeLimit = _adConfig.ADTimeOut;
adsSearcher.ServerPageTimeLimit = _adConfig.ADTimeOut;
//adsSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
adsSearcher.Filter = "(sAMAccountName=" + user + ")";
try
{
SearchResult sr = adsSearcher.FindOne();
if (sr != null)
{
ADObj.StafflinkNo = GetUserPropertyValue(sr, "sAMAccountName", 0); ;
ADObj.FirstName = GetUserPropertyValue(sr, "givenname", 0);
ADObj.LastName = GetUserPropertyValue(sr, "sn", 0);
ADObj.Email = GetUserPropertyValue(sr, "mail", 0);
ADObj.Company = GetUserPropertyValue(sr, "company", 0);
ADObj.Location = GetUserPropertyValue(sr, "physicalDeliveryOfficeName", 0);
ADObj.Department = GetUserPropertyValue(sr, "department", 0);
ADObj.BadPwdCount = GetUserPropertyValue(sr, "badPwdCount", 0);
ADObj.Phone = GetUserPropertyValue(sr, "telephonenumber", 0);
ADObj.DisplayName = GetUserPropertyValue(sr, "displayName", 0);
ADObj.Manager = GetUserPropertyValue(sr, "manager", 0);
// we will retrieve the count of staff in DirectReports as a flag to determine if this user is a manager
// we will assume if no staff then requests lodged by this user will need signoff by their manager
//LoginResult.StaffListCount = sr.Properties["DirectReports"].Count;
//LoginResult.PWD = ADConfig.LDAPPassword;
//LoginResult.User = ADConfig.LDAPUser;
/* // we do not think we need actual staff IDs at this point - a count of staff will be enough for this application
// but leave here in case we need to re-use this in another app.
List<string> StaffList = new List<string>();
foreach (string objProperty in sr.Properties["DirectReports"])
{
string emp = objProperty.ToString().Split(',')[0];
emp = emp.Replace("CN=", "");
StaffList.Add(emp);
//emps.Add(emp);
//user.StaffList += '|';
//user.StaffList += emp;
//
}
LoginResult.StaffList = JsonConvert.SerializeObject(StaffList);
*/
try
{
if (ADObj.Manager != String.Empty)
{
String managerInfo = Convert.ToString(ADObj.Manager);
String managerID = managerInfo.Split(',')[0].Split('=')[1];
String managerOU = managerInfo.Split(',')[1].Split('=')[1];
List<MyADObject> managerDetails = Search(managerID, managerOU);
// JToken managerDetails = Search(managerID);
ADObj.ManagerDetails = managerDetails[0].ToString();
}
}
catch (Exception ex)
{
ADObj.ManagerDetails = "Not available: " + ex.Message;
}
}
}
catch (Exception ex2)
{
// Failed to authenticate. Most likely it is caused by unknown user
// id or bad strPassword.
res = false;
}
}
catch
{
res = false;
}
}
ADObj.result = res;
// string token = "";
// long tickTock = DateTime.Now.Ticks;
// if (res)
// {
//string tokenPT = app + "|" + user + "|" + pass + "|" + tickTock + "|" + "NBM";
//token = CommonCrypt.EncryptString(tokenPT, "bagmas2011+", "a1b2c3d4");
//token = CommonEncoding.Base64Encode(token);
//}
//LoginResult.Token = token;
//LoginResult.Time = tickTock;
//return LoginResult;
return ADObj;
}
public List<MyADObject> Search(string q, string ou)
{
//ou = "Nepean Blue Mountains";
MyADObject ADObj = new Models.MyADObject();
//ADConfig.Init();
List<MyADObject> lstLDAPUser = new List<MyADObject>();
if (string.IsNullOrEmpty(q))
q = "______"; //defualt not found
System.DirectoryServices.DirectoryEntry dirEntry = new System.DirectoryServices.DirectoryEntry(_adConfig.LDAPPath, _adConfig.LDAPUser, _adConfig.LDAPPassword);
DirectorySearcher dirSearch = new DirectorySearcher(dirEntry);
dirSearch.ClientTimeout = _adConfig.ADTimeOut;
dirSearch.ServerTimeLimit = _adConfig.ADTimeOut;
dirSearch.ServerPageTimeLimit = _adConfig.ADTimeOut;
dirSearch.Filter = "(&(objectClass=user)(|(cn=" + q + "*)))";
dirSearch.SearchRoot = dirEntry;
dirSearch.SearchScope = SearchScope.Subtree;
dirSearch.PageSize = 100;
dirSearch.Sort = new SortOption("displayName", SortDirection.Ascending);
using (SearchResultCollection src = dirSearch.FindAll())
{
int i = 0;
foreach (SearchResult sr in src)
{
i++;
if (i > 100)
break;
bool bLogindisabled = true;
string sTmp = GetUserPropertyValue(sr, "logindisabled", 0);
bLogindisabled = (sTmp == string.Empty ? false : Convert.ToBoolean(sTmp));
if (!bLogindisabled)
{
sTmp = GetUserPropertyValue(sr, "passwordexpirationtime", 0);
if (sTmp != "")
{
try
{
if (DateTime.Now > Convert.ToDateTime(sTmp))
{
bLogindisabled = true;
}
}
catch { }
}
}
if (!bLogindisabled)
{
MyADObject user = new MyADObject();
// user.Login = GetUserPropertyValue(sr, "sAMAccountName", 0);
user.StafflinkNo = GetUserPropertyValue(sr, "sAMAccountName", 0);
user.FirstName = GetUserPropertyValue(sr, "givenname", 0);
user.LastName = GetUserPropertyValue(sr, "sn", 0);
user.Email = GetUserPropertyValue(sr, "mail", 0);
user.Company = GetUserPropertyValue(sr, "company", 0);
user.Location = GetUserPropertyValue(sr, "physicalDeliveryOfficeName", 0);
user.Department = GetUserPropertyValue(sr, "department", 0);
user.BadPwdCount = GetUserPropertyValue(sr, "badPwdCount", 0);
//user.company = GetUserPropertyValue(sr, "company", 0);
user.Phone = GetUserPropertyValue(sr, "telephonenumber", 0);
user.DisplayName = GetUserPropertyValue(sr, "displayName", 0);
//user.distinguishedName = GetUserPropertyValue(sr, "distinguishedName", 0);
user.DisplayName = GetUserPropertyValue(sr, "displayName", 0);
lstLDAPUser.Add(user);
}
}
}
if (dirSearch != null)
dirSearch.Dispose();
if (dirEntry != null)
dirEntry.Dispose();
return lstLDAPUser;
}//end method
private string GetUserPropertyValue(SearchResult res, string sPropertyName, int lIndex)
{
try
{
if (res.Properties[sPropertyName].Count > lIndex)
{
string s;
object v = res.Properties[sPropertyName][lIndex];
if (v.GetType() == typeof(byte[]))
{
s = System.Text.ASCIIEncoding.ASCII.GetString((byte[])v);
}
else if (v.GetType() == typeof(DateTime))
{
s = ((DateTime)v).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss");
}
else
{
s = v.ToString();
}
return (s);
}
else
{
return ("");
}
}
catch
{
return ("");
}
}
}
}