diff --git a/App_LocalResources/MainControl.ascx.resx b/App_LocalResources/MainControl.ascx.resx index 79c4807..9377a24 100644 --- a/App_LocalResources/MainControl.ascx.resx +++ b/App_LocalResources/MainControl.ascx.resx @@ -279,4 +279,7 @@ Max allowed file size for upload is {0} + + Export in progress... + \ No newline at end of file diff --git a/Components/CommonController.cs b/Components/CommonController.cs index 8777a32..346cd78 100644 --- a/Components/CommonController.cs +++ b/Components/CommonController.cs @@ -164,11 +164,39 @@ public static void ResponseFile(string ContentType, byte[] lstBytes, string File objResponse.End(); } + public static string SaveFile(int PortalId, string ToWrite, string FileName) + { + PortalSettings objPortalSettings = new PortalSettings(PortalId); + string Path = objPortalSettings.HomeDirectoryMapPath + "UsersExportImport\\"; + if (!System.IO.Directory.Exists(Path)) + { + System.IO.Directory.CreateDirectory(Path); + } + //delete all files in directory for security reason + foreach (string tempName in System.IO.Directory.GetFiles(Path)) + { + System.IO.File.Delete(tempName); + } + + System.IO.StreamWriter sw = new System.IO.StreamWriter(Path + FileName, false, Encoding.UTF8); + sw.Write(ToWrite); + sw.Close(); + + return objPortalSettings.HomeDirectory + "UsersExportImport/" + FileName; + } + public static string GetMaxAllowedFileSize() { - System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); - HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection; - return string.Format("{0} kB", section.MaxRequestLength); + try + { + System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); + HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection; + return string.Format("{0} kB", section.MaxRequestLength); + } + catch + { + return "undefined"; + } } } } \ No newline at end of file diff --git a/Components/ExportController.cs b/Components/ExportController.cs new file mode 100644 index 0000000..48b43c1 --- /dev/null +++ b/Components/ExportController.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Collections; +using System.Linq; +using System.Net.Mail; +using System.Text; +using System.Text.RegularExpressions; +using System.Web; +using System.Web.Configuration; +using DotNetNuke.Entities.Users; +using DotNetNuke.Entities.Portals; + +namespace forDNN.Modules.UsersExportImport.Controller +{ + public class ExportController + { + #region Export + + public static string DoExport(int PortalId, Models.ExportInfo objExportInfo) + { + string ResultURL = ""; + try + { + IDataReader idr = null; + + //check if IsDeleted column exists + bool IsDeletedExists = true; + try + { + idr = DotNetNuke.Data.DataProvider.Instance().ExecuteSQL("SELECT TOP 1 IsDeleted FROM {databaseOwner}{objectQualifier}vw_Users"); + } + catch + { + IsDeletedExists = false; + } + + //build dynamic query to retireve data + Hashtable htFieldNames = new Hashtable(); + htFieldNames["UserID"] = 1; + htFieldNames["UserName"] = 1; + htFieldNames["FirstName"] = 1; + htFieldNames["LastName"] = 1; + htFieldNames["DisplayName"] = 1; + htFieldNames["IsSuperUser"] = 1; + htFieldNames["Email"] = 1; + htFieldNames["AffiliateId"] = 1; + htFieldNames["Authorised"] = 1; + + StringBuilder sbSelect = new StringBuilder( + @"SELECT u.UserID, + u.UserName, + u.FirstName, + u.LastName, + u.DisplayName, + u.IsSuperUser, + u.Email, + u.AffiliateId, + u.Authorised"); + + StringBuilder sbFrom = new StringBuilder(@" + FROM {databaseOwner}{objectQualifier}vw_Users u "); + StringBuilder sbWhere = new StringBuilder(@" + WHERE (1=1) + AND ((u.PortalId={0}) OR (u.IsSuperUser=1)) ".Replace("{0}", PortalId.ToString())); + + //check SuperUsers + if (!objExportInfo.IncludeSuperUsers) + { + sbWhere.Append(" AND (u.IsSuperUser=0) "); + } + + //check deleted accounts + if (IsDeletedExists) + { + sbSelect.Append(", u.IsDeleted"); + if (!objExportInfo.IncludeDeleted) + { + sbWhere.Append(" AND (u.IsDeleted=0) "); + } + htFieldNames["IsDeleted"] = 1; + } + + //check authorised accounts + if (!objExportInfo.IncludeNonAuthorised) + { + sbWhere.Append(" AND (u.Authorised=1) "); + } + + //check if requires to export roles + if (objExportInfo.ExportRoles) + { + sbSelect.Append(@", (SELECT CAST(ur.RoleID AS nvarchar(10)) + ',' + FROM {databaseOwner}{objectQualifier}UserRoles ur + WHERE (ur.UserID=u.UserID) AND (ur.RoleID IN (SELECT r.RoleID FROM {databaseOwner}{objectQualifier}Roles r WHERE (r.PortalID={0}))) + FOR XML PATH('')) RoleIDs, + + (SELECT r.RoleName + ',' + FROM {databaseOwner}{objectQualifier}UserRoles ur + LEFT JOIN {databaseOwner}{objectQualifier}Roles r ON (ur.RoleID=r.RoleID) + WHERE (ur.UserID=u.UserID) AND (ur.RoleID IN (SELECT r.RoleID FROM {databaseOwner}{objectQualifier}Roles r WHERE (r.PortalID={0}))) + FOR XML PATH('')) Roles +").Replace("{0}", PortalId.ToString()); + + htFieldNames["RoleIDs"] = 1; + htFieldNames["Roles"] = 1; + } + + //define properties + foreach (string li in objExportInfo.PropertiesToExport.Split(new char[] { ',' })) + { + string[] objParam = li.Split(new char[] { '=' }); + if (htFieldNames[objParam[0]] != null) + { + continue; + } + + htFieldNames[objParam[0]] = 1; + + sbSelect.Append(", up{0}.PropertyValue [{1}] " + .Replace("{0}", objParam[1]) + .Replace("{1}", objParam[0]) + ); + + + sbFrom.Append(" LEFT JOIN {databaseOwner}{objectQualifier}UserProfile up{0} ON ((u.UserID=up{0}.UserID) AND (up{0}.PropertyDefinitionID={0})) " + .Replace("{0}", objParam[1])); + } + + idr = DotNetNuke.Data.DataProvider.Instance().ExecuteSQL(sbSelect.ToString() + sbFrom.ToString() + sbWhere.ToString()); + DataTable dt = DotNetNuke.Common.Globals.ConvertDataReaderToDataTable(idr); + if (objExportInfo.ExportPasswords) + { + dt = AddPasswordsColumn(PortalId, dt); + } + + string strResult = ""; + + switch (objExportInfo.ExportFileType) + { + case 0://temporary disabled for Excel + break; + case 1://XML - FOR XML RAW + strResult = CommonController.ToXML(dt); + ResultURL = CommonController.SaveFile(PortalId, + strResult, + string.Format("Users_{0:ddMMyyyy_HHmmss}_{1}.xml", DateTime.Now, System.Guid.NewGuid().ToString())); + break; + case 2://CSV + strResult = CommonController.ToCSV(dt, true, ","); + ResultURL = CommonController.SaveFile(PortalId, + strResult, + string.Format("Users_{0:ddMMyyyy_HHmmss}_{1}.csv", DateTime.Now, System.Guid.NewGuid().ToString())); + break; + } + } + catch (System.Exception ex) + { + DotNetNuke.Services.Exceptions.Exceptions.LogException(ex); + } + + return ResultURL; + } + + private static DataTable AddPasswordsColumn(int PortalId, DataTable dt) + { + dt.Columns.Add("Password", "".GetType()); + + foreach (DataRow dr in dt.Rows) + { + if (DotNetNuke.Security.Membership.MembershipProviderConfig.PasswordRetrievalEnabled) + { + UserInfo objUser = UserController.GetUserById(PortalId, (int)dr["userid"]); + dr["Password"] = UserController.GetPassword(ref objUser, objUser.Membership.PasswordAnswer); + } + else + { + dr["Password"] = ""; + } + } + + return dt; + } + + #endregion + + } +} \ No newline at end of file diff --git a/Install/_UsersExportImport.dnn b/Install/_UsersExportImport.dnn index 8200ed1..c0f75fb 100644 --- a/Install/_UsersExportImport.dnn +++ b/Install/_UsersExportImport.dnn @@ -1,10 +1,10 @@  - + forDNN.UsersExportImport This module allows to export/import users, user profiles properties and roles to DNN (former DotNetNuke) from CSV/XML files. This is simple and fast way to create your users accounts in one click. - Sergey Velichko + Sergiy Velychko forDNN Team <a href="http://forDNN.com" target="_blank">http://forDNN.com</a> <a href="mailto:support@forDNN.com" target="_blank">support@forDNN.com</a> @@ -25,6 +25,13 @@ Version 1.1.7:
+Fixed issue with special chars "Zero width space" and "Zero width no-break space" in the names of the columns.
+Improved import process when missed some required columns: DisplayName, IsSuperUser, Username, AffiliateId.
+ +Version 1.1.6:
+Added export support for versions 9.x.
+ Version 1.1.5:
Fixed an issue with multi portals DNN installation (there were dublicates of the users).
Added notification on maximum allowed file size for import.
diff --git a/Install/forDNN.UsersExportImport_v.01.01.06.zip b/Install/forDNN.UsersExportImport_v.01.01.06.zip new file mode 100644 index 0000000..068794a Binary files /dev/null and b/Install/forDNN.UsersExportImport_v.01.01.06.zip differ diff --git a/Install/forDNN.UsersExportImport_v.01.01.07.zip b/Install/forDNN.UsersExportImport_v.01.01.07.zip new file mode 100644 index 0000000..e4cf454 Binary files /dev/null and b/Install/forDNN.UsersExportImport_v.01.01.07.zip differ diff --git a/MainControl.ascx b/MainControl.ascx index fbb138d..4e4847c 100644 --- a/MainControl.ascx +++ b/MainControl.ascx @@ -33,7 +33,7 @@ -
+
@@ -64,8 +64,10 @@
- + +
@@ -127,8 +129,68 @@
diff --git a/MainControl.ascx.cs b/MainControl.ascx.cs index 964cb34..8305b37 100644 --- a/MainControl.ascx.cs +++ b/MainControl.ascx.cs @@ -52,6 +52,11 @@ private void ExtraPageLoad() lblMaxAllowedFileSize.Text = string.Format(Localization.GetString("MaxAllowedFileSize", this.LocalResourceFile), CommonController.GetMaxAllowedFileSize()); + if (this.UserInfo != null) + { + divIncludeSuperUsers.Visible = this.UserInfo.IsSuperUser; + } + if (!IsPostBack) { FillProperties(); @@ -65,6 +70,8 @@ private void ExtraPageLoad() lblExportPasswordsDisabled.Visible = true; } } + + btnExportUsers.Attributes.Add("onclick", string.Format("javascript:return doExport({0});", this.ModuleId)); } protected void Page_Load(object sender, System.EventArgs e) @@ -85,6 +92,12 @@ protected void Page_Load(object sender, System.EventArgs e) #region Import + private string RemoveWhiteSpaces(string Source) + { + //remove Zero width space and Zero width no-break space + return Source.Trim(new char[] { '\uFEFF', '\u200B' }); + } + private DataTable CSV2Table(byte[] lstBytes) { string Separator = ","; @@ -100,7 +113,8 @@ private DataTable CSV2Table(byte[] lstBytes) foreach (string Header in lstRows[0].Split(new char[] { ',' })) { - dt.Columns.Add(Header); + //lets remove white space chars from the column's name + dt.Columns.Add(RemoveWhiteSpaces(Header)); } for (int i = 1; (i < lstRows.Length - 1); i++) @@ -216,6 +230,15 @@ private string ValidatePassword(UserInfo objUser, bool RandomPassword) return UserController.GeneratePassword(); } + private object GetDataRowValue(DataTable dt, DataRow dr, string FieldName, object DefaultValue) + { + if (dt.Columns.IndexOf(FieldName) == -1) + { + return DefaultValue; + } + return dr[FieldName]; + } + private void DoImport() { if (objFile.PostedFile.FileName == "") @@ -255,7 +278,7 @@ private void DoImport() } string NonProfileFields = ",userid,username,firstname,lastname,displayname,issuperuser,email,affiliateid,authorised,isdeleted,roleids,roles,"; - + string SubjectTemplate = Localization.GetString("EmailUserSubject", this.LocalResourceFile); string BodyTemplate = Localization.GetString("EmailUserBody", this.LocalResourceFile); @@ -273,11 +296,13 @@ private void DoImport() objUser.Email = string.Format("{0}", dr["Email"]); objUser.FirstName = string.Format("{0}", dr["FirstName"]); objUser.LastName = string.Format("{0}", dr["LastName"]); - objUser.DisplayName = string.Format("{0}", dr["DisplayName"]); + objUser.DisplayName = string.Format("{0}", GetDataRowValue(dt, dr, "DisplayName", string.Format("{0} {1}", dr["FirstName"], dr["LastName"]) )); objUser.PortalID = this.PortalId; - objUser.IsSuperUser = (string.Format("{0}", dr["IsSuperUser"]) == "1"); - objUser.Username = string.Format("{0}", dr["Username"]); + objUser.IsSuperUser = (string.Format("{0}", GetDataRowValue(dt, dr, "IsSuperUser", "0")) == "1"); + + //use email as username, when username is not provided + objUser.Username = string.Format("{0}", GetDataRowValue(dt, dr, "Username", objUser.Email)); if (dt.Columns.Contains("Password")) { @@ -286,12 +311,11 @@ private void DoImport() objUser.Membership.Password = ValidatePassword(objUser, cbRandomPassword.Checked); int AffiliateID = -1; - if (Int32.TryParse(string.Format("{0}", dr["AffiliateId"]), out AffiliateID)) + if (Int32.TryParse(string.Format("{0}", GetDataRowValue(dt, dr, "AffiliateId", -1)), out AffiliateID)) { objUser.AffiliateID = AffiliateID; } - objUser.Membership.Approved = true; objUser.Membership.PasswordQuestion = objUser.Membership.Password; objUser.Membership.UpdatePassword = cbForcePasswordChange.Checked;//update password on next login @@ -300,17 +324,20 @@ private void DoImport() DotNetNuke.Entities.Users.UserController.CreateUser(ref objUser); if (objCreateStatus == DotNetNuke.Security.Membership.UserCreateStatus.Success) { - objUser.Profile.SetProfileProperty("OldUserID", string.Format("{0}", dr["UserID"])); + if (dt.Columns.IndexOf("UserID") != -1) + { + objUser.Profile.SetProfileProperty("OldUserID", string.Format("{0}", dr["UserID"])); + } SuccessUsersCount++; //Update Profile - objUser.Profile.Country = string.Format("{0}", dr["Country"]); - objUser.Profile.Street = string.Format("{0}", dr["Street"]); - objUser.Profile.City = string.Format("{0}", dr["City"]); - objUser.Profile.Region = string.Format("{0}", dr["Region"]); - objUser.Profile.PostalCode = string.Format("{0}", dr["PostalCode"]); - objUser.Profile.Unit = string.Format("{0}", dr["Unit"]); - objUser.Profile.Telephone = string.Format("{0}", dr["Telephone"]); + objUser.Profile.Country = string.Format("{0}", GetDataRowValue(dt, dr, "Country", "")); + objUser.Profile.Street = string.Format("{0}", GetDataRowValue(dt, dr, "Street", "")); + objUser.Profile.City = string.Format("{0}", GetDataRowValue(dt, dr, "City", "")); + objUser.Profile.Region = string.Format("{0}", GetDataRowValue(dt, dr, "Region", "")); + objUser.Profile.PostalCode = string.Format("{0}", GetDataRowValue(dt, dr, "PostalCode", "")); + objUser.Profile.Unit = string.Format("{0}", GetDataRowValue(dt, dr, "Unit", "")); + objUser.Profile.Telephone = string.Format("{0}", GetDataRowValue(dt, dr, "Telephone", "")); objUser.Profile.FirstName = objUser.FirstName; objUser.Profile.LastName = objUser.LastName; @@ -356,9 +383,9 @@ private void DoImport() if (cbEmailUser.Checked) { string SendEmailResult = CommonController.SendEmail(objUser, SubjectTemplate, BodyTemplate, this.PortalSettings); - + switch (SendEmailResult) - { + { case "": //success break; @@ -460,165 +487,6 @@ protected void btnImport_Click(object sender, EventArgs e) #endregion - #region Export - - protected void btnExportUsers_Click(object sender, EventArgs e) - { - DoExport(); - } - - private void DoExport() - { - IDataReader idr = null; - - //check if IsDeleted column exists - bool IsDeletedExists = true; - try - { - idr = DotNetNuke.Data.DataProvider.Instance().ExecuteSQL("SELECT TOP 1 IsDeleted FROM {databaseOwner}{objectQualifier}vw_Users"); - } - catch - { - IsDeletedExists = false; - } - - //build dynamic query to retireve data - Hashtable htFieldNames = new Hashtable(); - htFieldNames["UserID"] = 1; - htFieldNames["UserName"] = 1; - htFieldNames["FirstName"] = 1; - htFieldNames["LastName"] = 1; - htFieldNames["DisplayName"] = 1; - htFieldNames["IsSuperUser"] = 1; - htFieldNames["Email"] = 1; - htFieldNames["AffiliateId"] = 1; - htFieldNames["Authorised"] = 1; - - StringBuilder sbSelect = new StringBuilder( -@"SELECT u.UserID, - u.UserName, - u.FirstName, - u.LastName, - u.DisplayName, - u.IsSuperUser, - u.Email, - u.AffiliateId, - u.Authorised"); - - StringBuilder sbFrom = new StringBuilder(@" - FROM {databaseOwner}{objectQualifier}vw_Users u "); - StringBuilder sbWhere = new StringBuilder(@" - WHERE (1=1) - AND ((u.PortalId={0}) OR (u.IsSuperUser=1)) ".Replace("{0}", this.PortalId.ToString())); - - //check SuperUsers - if (!cbIncludeSuperUsers.Checked) - { - sbWhere.Append(" AND (u.IsSuperUser=0) "); - } - - //check deleted accounts - if (IsDeletedExists) - { - sbSelect.Append(", u.IsDeleted"); - if (!cbIncludeDeleted.Checked) - { - sbWhere.Append(" AND (u.IsDeleted=0) "); - } - htFieldNames["IsDeleted"] = 1; - } - - //check authorised accounts - if (!cbIncludeNonAuthorised.Checked) - { - sbWhere.Append(" AND (u.Authorised=1) "); - } - - //check if requires to export roles - if (cbExportRoles.Checked) - { - sbSelect.Append(@", (SELECT CAST(ur.RoleID AS nvarchar(10)) + ',' - FROM {databaseOwner}{objectQualifier}UserRoles ur - WHERE (ur.UserID=u.UserID) AND (ur.RoleID IN (SELECT r.RoleID FROM {databaseOwner}{objectQualifier}Roles r WHERE (r.PortalID={0}))) - FOR XML PATH('')) RoleIDs, - - (SELECT r.RoleName + ',' - FROM {databaseOwner}{objectQualifier}UserRoles ur - LEFT JOIN {databaseOwner}{objectQualifier}Roles r ON (ur.RoleID=r.RoleID) - WHERE (ur.UserID=u.UserID) AND (ur.RoleID IN (SELECT r.RoleID FROM {databaseOwner}{objectQualifier}Roles r WHERE (r.PortalID={0}))) - FOR XML PATH('')) Roles -").Replace("{0}", this.PortalId.ToString()); - - htFieldNames["RoleIDs"] = 1; - htFieldNames["Roles"] = 1; - } - - //define properties - foreach (ListItem li in cblPropertiesToExport.Items) - { - if ((!li.Selected) || (htFieldNames[li.Text] != null)) - { - continue; - } - htFieldNames[li.Text] = 1; - - sbSelect.Append(", up{0}.PropertyValue [{1}] " - .Replace("{0}", li.Value) - .Replace("{1}", li.Text) - ); - - - sbFrom.Append(" LEFT JOIN {databaseOwner}{objectQualifier}UserProfile up{0} ON ((u.UserID=up{0}.UserID) AND (up{0}.PropertyDefinitionID={0})) " - .Replace("{0}", li.Value)); - } - - idr = DotNetNuke.Data.DataProvider.Instance().ExecuteSQL(sbSelect.ToString() + sbFrom.ToString() + sbWhere.ToString()); - DataTable dt = DotNetNuke.Common.Globals.ConvertDataReaderToDataTable(idr); - if (cbExportPasswords.Checked) - { - dt = AddPasswordsColumn(dt); - } - - string strResult = ""; - - switch (ddlExportFileType.SelectedValue) - { - case "0"://temporary disabled for Excel - break; - case "1"://XML - FOR XML RAW - strResult = CommonController.ToXML(dt); - CommonController.ResponseFile("text/xml", System.Text.Encoding.UTF8.GetBytes(strResult), string.Format("Users_{0:ddMMyyyy_HHmmss}.xml", DateTime.Now)); - break; - case "2"://CSV - strResult = CommonController.ToCSV(dt, true, ","); - CommonController.ResponseFile("text/csv", System.Text.Encoding.UTF8.GetBytes(strResult), string.Format("Users_{0:ddMMyyyy_HHmmss}.csv", DateTime.Now)); - break; - } - - } - - private DataTable AddPasswordsColumn(DataTable dt) - { - dt.Columns.Add("Password", "".GetType()); - - foreach (DataRow dr in dt.Rows) - { - if (DotNetNuke.Security.Membership.MembershipProviderConfig.PasswordRetrievalEnabled) - { - UserInfo objUser = UserController.GetUserById(this.PortalId, (int)dr["userid"]); - dr["Password"] = UserController.GetPassword(ref objUser, objUser.Membership.PasswordAnswer); - } - else - { - dr["Password"] = ""; - } - } - - return dt; - } - - #endregion - #region "Optional Interfaces" /// ----------------------------------------------------------------------------- diff --git a/MainControl.ascx.designer.cs b/MainControl.ascx.designer.cs index fbe6eee..f8f0814 100644 --- a/MainControl.ascx.designer.cs +++ b/MainControl.ascx.designer.cs @@ -48,6 +48,15 @@ public partial class MainControl { /// protected global::System.Web.UI.WebControls.DropDownList ddlExportFileType; + /// + /// divIncludeSuperUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl divIncludeSuperUsers; + /// /// lblIncludeSuperUsers control. /// @@ -181,7 +190,16 @@ public partial class MainControl { /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.LinkButton btnExportUsers; + protected global::System.Web.UI.WebControls.HyperLink btnExportUsers; + + /// + /// lblExportInProgress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblExportInProgress; /// /// lblImport control. diff --git a/UsersExportImport.csproj b/UsersExportImport.csproj index fb1f1c4..127d7aa 100644 --- a/UsersExportImport.csproj +++ b/UsersExportImport.csproj @@ -1,5 +1,5 @@  - + Debug @@ -24,6 +24,7 @@ + true @@ -50,20 +51,34 @@ ..\..\..\bin\dotnetnuke.dll False + + False + ..\..\..\..\WebSites\unpsa2\bin\DotNetNuke.Web.dll + False ..\..\bin\Microsoft.ApplicationBlocks.Data.dll False + + False + ..\..\..\..\WebSites\unpsa2\bin\Newtonsoft.Json.dll + + + + + False + ..\..\..\..\WebSites\dnn910\bin\System.Web.Http.dll + @@ -72,7 +87,9 @@ + + MainControl.ascx @@ -81,12 +98,13 @@ MainControl.ascx + + Designer - Designer @@ -137,6 +155,7 @@ - D:\Work\Projects\forDNN\UsersExportImport\Install\Compiled.bat + + \ No newline at end of file diff --git a/UsersExportImport.csproj.user b/UsersExportImport.csproj.user index b5a010b..452c503 100644 --- a/UsersExportImport.csproj.user +++ b/UsersExportImport.csproj.user @@ -1,7 +1,8 @@  - C:\WebSites\dnn629\bin\ + C:\WebSites\dnn910\bin\ + false diff --git a/UsersExportImport.sln b/UsersExportImport.sln index c18fcad..9e3e73d 100644 --- a/UsersExportImport.sln +++ b/UsersExportImport.sln @@ -9,8 +9,8 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {83108CB8-3DF3-4332-9AF3-FCFFB133CFFA}.Debug|Any CPU.ActiveCfg = Release|Any CPU - {83108CB8-3DF3-4332-9AF3-FCFFB133CFFA}.Debug|Any CPU.Build.0 = Release|Any CPU + {83108CB8-3DF3-4332-9AF3-FCFFB133CFFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {83108CB8-3DF3-4332-9AF3-FCFFB133CFFA}.Debug|Any CPU.Build.0 = Debug|Any CPU {83108CB8-3DF3-4332-9AF3-FCFFB133CFFA}.Release|Any CPU.ActiveCfg = Release|Any CPU {83108CB8-3DF3-4332-9AF3-FCFFB133CFFA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection diff --git a/UsersExportImport.v11.suo b/UsersExportImport.v11.suo index 66d0630..5579f49 100644 Binary files a/UsersExportImport.v11.suo and b/UsersExportImport.v11.suo differ diff --git a/bin/forDNN.Modules.UsersExportImport.dll b/bin/forDNN.Modules.UsersExportImport.dll index c511e9f..fa640a5 100644 Binary files a/bin/forDNN.Modules.UsersExportImport.dll and b/bin/forDNN.Modules.UsersExportImport.dll differ diff --git a/bin/forDNN.Modules.UsersExportImport.pdb b/bin/forDNN.Modules.UsersExportImport.pdb index 5c01d11..08189d6 100644 Binary files a/bin/forDNN.Modules.UsersExportImport.pdb and b/bin/forDNN.Modules.UsersExportImport.pdb differ