using System; using System.Collections; using System.Data; using System.Web.UI; using System.Web.Security; using Microsoft.SharePoint; using Microsoft.SharePoint.Administration; using Microsoft.SharePoint.Utilities; using System.Reflection; using System.Globalization; using System.Linq; namespace CKS.FormsBasedAuthentication { /// /// Data source for the User Management user display view. Gets all FBA users and adds basic membership info /// class FBAUsersView : DataSourceView { private FBADataSource _owner; public FBAUsersView(FBADataSource owner, string viewName) : base(owner, viewName) { _owner = owner; } protected override IEnumerable ExecuteSelect(DataSourceSelectArguments selectArgs) { // only continue if a membership provider has been configured if (!Utils.IsProviderConfigured()) return null; // get site details SPSite site = SPContext.Current.Site; string provider = Utils.GetMembershipProvider(site); if (provider == null) return null; SPWeb web = site.RootWeb; string yes = LocalizedString.GetString("FBAPackFeatures", "Yes"); string no = LocalizedString.GetString("FBAPackFeatures", "No"); // we only display users that have been added to SharePoint // we use the localized name, safe for non-English SharePoint servers SPList list = web.SiteUserInfoList; //web.Lists[SPUtility.GetLocalizedString("$Resources:userinfo_schema_listtitle", "core", web.Language)]; // create query list SPQuery query = new SPQuery(); query.Query = string.Format( "" + "" + "Person" + "{0}" + "" + "" + "" + "" + "", provider); query.ViewFields = ""; // run query to get table of users DataTable users = null; try { users = list.GetItems(query).GetDataTable(); } catch (Exception ex) { Utils.LogError(ex); return null; } if (users == null) { users = new DataTable(); users.Columns.Add("ID"); users.Columns.Add("Title"); users.Columns.Add("Name"); users.Columns.Add("LinkTitle"); users.Columns.Add("Email"); users.Columns.Add("Modified", typeof(DateTime)); users.Columns.Add("Created", typeof(DateTime)); } users.Columns.Add("Active"); users.Columns.Add("Locked"); users.Columns.Add("LastLogin", typeof(DateTime)); users.Columns.Add("IsInSharePoint"); users.Columns.Add("NonProviderName"); //// Add additional user data to table //foreach (DataRow row in users.Rows) //{ // // remove provider name to get actual user name // string userName = Utils.DecodeUsername(row["Name"].ToString()); // row["NonProviderName"] = userName; //} int totalRecords = 0; //LogLocal("received the user data"); var datarowresults = users.AsEnumerable(); // LogLocal("get enumberation variable"); var membershipUserColl = Utils.BaseMembershipProvider(site).GetAllUsers(0, 100000, out totalRecords).Cast().ToList(); //LogLocal("get member ship user list"); //membershipUserColl.Where(memberuser => memberuser.UserName.ToLower() == Utils.DecodeUsername(p["Name"].ToString())).ToList().ForEach(row => row.Delete()); int totalMemebership = membershipUserColl.Count; var userList = users.Rows.Cast().ToList(); //LogLocal("User Name:" + Convert.ToString(userList[0]["Name"])); //LogLocal("Loop started"); var resultJoin = from member in membershipUserColl join curUser in userList on member.UserName.ToLower() equals Utils.DecodeUsername(curUser["Name"].ToString()) into gj from subpet in gj.DefaultIfEmpty() select new { member.UserName, IsApproved = member.IsApproved, IsLockedOut = member.IsLockedOut, Email = member.Email, LastLoginDate = member.LastLoginDate, curRow = subpet }; foreach (var item in resultJoin) { if (item.curRow != null) { item.curRow["Name"] = item.UserName; item.curRow["Active"] = item.IsApproved ? yes : no; item.curRow["Locked"] = item.IsLockedOut ? yes : no; item.curRow["LastLogin"] = item.LastLoginDate; item.curRow["IsInSharePoint"] = yes; } else { //Add member to the data table DataRow datanewuser = users.NewRow(); datanewuser["Name"] = item.UserName; datanewuser["Email"] = item.Email; datanewuser["Active"] = item.IsApproved ? yes : no; datanewuser["Locked"] = item.IsLockedOut ? yes : no; datanewuser["LastLogin"] = item.LastLoginDate; datanewuser["IsInSharePoint"] = no; users.Rows.Add(datanewuser); } } #region "working" // Working //for (int i = 0; i < totalMemebership; i++) //{ // MembershipUser memberuser = membershipUserColl[i]; // var curUser = userList.Where(p => p["Name"].ToString().Contains(memberuser.UserName.ToLower())).FirstOrDefault(); //.Where(p => memberuser.UserName.ToLower() == Utils.DecodeUsername(p["Name"].ToString())).FirstOrDefault(); // bool bFoundMember = false; // if (curUser != null) // { // curUser["Name"] = memberuser.UserName; // curUser["Active"] = memberuser.IsApproved ? yes : no; // curUser["Locked"] = memberuser.IsLockedOut ? yes : no; // curUser["LastLogin"] = memberuser.LastLoginDate; // curUser["IsInSharePoint"] = yes; // bFoundMember = true; // } // if (!bFoundMember) // { // //Add member to the data table // DataRow datanewuser = users.NewRow(); // datanewuser["Name"] = memberuser.UserName; // datanewuser["Email"] = memberuser.Email; // datanewuser["Active"] = memberuser.IsApproved ? yes : no; // datanewuser["Locked"] = memberuser.IsLockedOut ? yes : no; // datanewuser["LastLogin"] = memberuser.LastLoginDate; // datanewuser["IsInSharePoint"] = no; // users.Rows.Add(datanewuser); // } //} //Working end #endregion // LogLocal("Loop end"); //foreach (MembershipUser memberuser in membershipUserColl) //{ // LogLocal("do user query started"); //var curUser = datarowresults.Where(p => memberuser.UserName.ToLower() == p["Name"].ToString()).FirstOrDefault(); //LogLocal("do user query result received"); //bool bFoundMember = false; //if (curUser != null) //{ // curUser["Name"] = memberuser.UserName; // curUser["Active"] = memberuser.IsApproved ? yes : no; // curUser["Locked"] = memberuser.IsLockedOut ? yes : no; // curUser["LastLogin"] = memberuser.LastLoginDate; // curUser["IsInSharePoint"] = yes; // bFoundMember = true; //} //else //{ //} //foreach (DataRow row in users.Rows) //{ // if (memberuser.UserName.ToLower() == row["NonProviderName"].ToString().ToLower()) // { // row["Name"] = memberuser.UserName; // row["Active"] = memberuser.IsApproved ? yes : no; // row["Locked"] = memberuser.IsLockedOut ? yes : no; // row["LastLogin"] = memberuser.LastLoginDate; // row["IsInSharePoint"] = yes; // bFoundMember = true; // //users.Rows[i].Delete(); // break; // } //} //if (!bFoundMember) //{ // //Add member to the data table // DataRow datanewuser = users.NewRow(); // datanewuser["Name"] = memberuser.UserName; // datanewuser["Email"] = memberuser.Email; // datanewuser["Active"] = memberuser.IsApproved ? yes : no; // datanewuser["Locked"] = memberuser.IsLockedOut ? yes : no; // datanewuser["LastLogin"] = memberuser.LastLoginDate; // datanewuser["IsInSharePoint"] = no; // users.Rows.Add(datanewuser); //} //} // LogLocal("Completed user check with FBA now start to remove user"); datarowresults.Where(p => p["IsInSharePoint"].ToString() != yes && p["IsInSharePoint"].ToString() != no).ToList().ForEach(row => row.Delete()); // LogLocal("remove user completed"); ////Remove users that weren't found in SharePoint //for (int i = users.Rows.Count - 1; i >= 0; i--) //{ // if (users.Rows[i]["IsInSharePoint"].ToString() != yes && users.Rows[i]["IsInSharePoint"].ToString() != no) // { // users.Rows[i].Delete(); // } //} // sort if a sort expression available DataView dataView = new DataView(users); if (selectArgs.SortExpression != String.Empty) { dataView.Sort = selectArgs.SortExpression; } //Filter the data if a filter is provided if (_owner.SearchText.Length > 0) { dataView.RowFilter = string.Format("Name LIKE '%{0}%' OR Email LIKE '%{0}%' OR Title LIKE '%{0}%'", _owner.SearchText); } else { dataView.RowFilter = ""; } // LogLocal("return the result"); // return as a DataList return (IEnumerable)dataView; } public void LogLocal(string messsage) { System.IO.StreamWriter sw = System.IO.File.AppendText( @"C:\LocalLog.txt"); try { string logLine = System.String.Format( "{0:G}: {1}.", System.DateTime.Now, messsage); sw.WriteLine(logLine); } catch (Exception ex) { } finally { sw.Close(); } } } }