From 6a3d57f48b2807e3deb72d5991fa2a9fc06fbeb5 Mon Sep 17 00:00:00 2001 From: Oswald's Arbitrary Domiciles Date: Wed, 1 Jul 2026 16:29:36 -0400 Subject: [PATCH 1/3] Adding option to User Auth action to use provided credentials as the OSDJoin username and password. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0633f29..41e0fbc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ UI++.VC.db Build Intermediate vcpkg_installed +/.vs/UI++/v18 +/.vs From d1c83062fd5e1ceffc0abb2dd92ebf246c4124d6 Mon Sep 17 00:00:00 2001 From: Oswald's Arbitrary Domiciles Date: Wed, 1 Jul 2026 16:35:36 -0400 Subject: [PATCH 2/3] Adding option to User Auth action to use provided credentials as the OSDJoin username and password. --- UI++/Actions/InteractiveActions.cpp | 2 ++ UI++/Constants.h | 6 ++++++ UI++/Dialogs/DlgUserAuth.cpp | 11 +++++++++++ UI++/Dialogs/DlgUserAuth.h | 5 ++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/UI++/Actions/InteractiveActions.cpp b/UI++/Actions/InteractiveActions.cpp index 31bcd95..5e1d45d 100644 --- a/UI++/Actions/InteractiveActions.cpp +++ b/UI++/Actions/InteractiveActions.cpp @@ -276,6 +276,7 @@ namespace UIpp CString domainController = GetXMLAttribute(m_actionData.pActionNode, XML_ATTRIBUTE_DOMAINCONTROLLER); bool doNotFallBack = FTW::IsTrue(GetXMLAttribute(m_actionData.pActionNode, XML_ATTRIBUTE_DONOTFALLBACK, XML_ACTION_FALSE)); + bool useForOSDJoin = FTW::IsTrue(GetXMLAttribute(m_actionData.pActionNode, XML_ATTRIBUTE_AUTH_USER_OSDJOIN, XML_ACTION_FALSE)); CDlgBase::DialogVisibilityFlags dlgFlags = CDlgBase::BuildDialogVisibilityFlags(true, includeBack, @@ -288,6 +289,7 @@ namespace UIpp getGroups, disableCancel, doNotFallBack, + useForOSDJoin, _tstoi(maxRetryCount)); CDlgUserAuth dlg(actionTitle, dlgFlags, m_actionData, &authdata); diff --git a/UI++/Constants.h b/UI++/Constants.h index 8c3e4da..221dae4 100644 --- a/UI++/Constants.h +++ b/UI++/Constants.h @@ -203,6 +203,8 @@ const _TCHAR* const XML_ATTRIBUTE_TITLE_PROGRESS_DEF = (_T("Collecting values fr DWORD const XML_ATTRIBUTE_MAXRUNTIME_DEF = 60; +const _TCHAR* const XML_ATTRIBUTE_AUTH_USER_OSDJOIN = (_T("UseForOSDJoin")); + const _TCHAR* const XML_ACTION_TYPE_USERINPUT = (_T("Input")); const _TCHAR* const XML_ACTION_TYPE_USERINFO = (_T("Info")); const _TCHAR* const XML_ACTION_TYPE_ERRORINFO = (_T("ErrorInfo")); @@ -405,6 +407,10 @@ const _TCHAR* const VAR_IPSUBNET = (_T("XIPSubnet")); const _TCHAR* const VAR_IPSUBNETMASK = (_T("XIPSubnetMask")); const _TCHAR* const VAR_MACADDRESS = (_T("XMACAddress")); +const _TCHAR* const VAR_OSDJOINPASS = (_T("OSDJoinPassword")); +const _TCHAR* const VAR_OSDJOINACCOUNT = ` (_T("OSDJoinAccount")); +const _TCHAR* const VAR_BLACKSLASH = (_T("\\")); + const _TCHAR* const VALUE_OSVERSION_PE = (_T("PE")); const _TCHAR* const VALUE_OSVERSION_NT = (_T("NT")); const _TCHAR* const VALUE_OSVERSION_2000 = (_T("2000")); diff --git a/UI++/Dialogs/DlgUserAuth.cpp b/UI++/Dialogs/DlgUserAuth.cpp index cab400c..1312fd8 100644 --- a/UI++/Dialogs/DlgUserAuth.cpp +++ b/UI++/Dialogs/DlgUserAuth.cpp @@ -72,6 +72,7 @@ void CDlgUserAuth::OnBnClickedNextaction() PTSTR pUser = new TCHAR[MAX_STRING_LENGTH]; PTSTR pDom = new TCHAR[MAX_STRING_LENGTH]; PTSTR pCount = new TCHAR[MAX_STRING_LENGTH]; + PTSTR pOSDUser = new TCHAR[MAX_STRING_LENGTH]; int count = 0; @@ -110,6 +111,16 @@ void CDlgUserAuth::OnBnClickedNextaction() m_actionData.pLdap->Authenticate(pUser, pPass, pDom, pDC, m_pData->m_doNotFallback); + if (m_pData->m_useForOSDJoin == true) + { + //I am not very good with C++ - there is probably a better way to do this. + _tcscat_s(pOSDUser, MAX_STRING_LENGTH, pDom); + _tcscat_s(pOSDUser, MAX_STRING_LENGTH, VAR_BLACKSLASH); + _tcscat_s(pOSDUser, MAX_STRING_LENGTH, pUser); + CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_OSDJOINACCOUNT, pOSDUser, true); + CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_OSDJOINPASS, pPass, FALSE); + } + SecureZeroMemory(pPass, sizeof(TCHAR) * (MAX_STRING_LENGTH - 1)); m_actionData.pCMLog->WriteMsg(FTWCMLOG::CCMLog::MsgType::Info, diff --git a/UI++/Dialogs/DlgUserAuth.h b/UI++/Dialogs/DlgUserAuth.h index 5d69b8f..ccde1b5 100644 --- a/UI++/Dialogs/DlgUserAuth.h +++ b/UI++/Dialogs/DlgUserAuth.h @@ -14,6 +14,7 @@ struct DlgUserAuthData bool getGroups = false, bool disableCancel = false, bool doNotFallback = false, + bool useForOSDJoin = false, int maxRetries = 0) : m_authorizedUserGroups(pAuthorizedUserGroups), m_userAttributes(pUserattributes), @@ -21,7 +22,8 @@ struct DlgUserAuthData m_getGroups(getGroups), m_disableCancel(disableCancel), m_doNotFallback(doNotFallback), - m_maxRetries(maxRetries) + m_maxRetries(maxRetries), + m_useForOSDJoin(useForOSDJoin) {}; CString m_authorizedUserGroups; @@ -31,6 +33,7 @@ struct DlgUserAuthData bool m_getGroups; bool m_disableCancel; bool m_doNotFallback; + bool m_useForOSDJoin; }; typedef DlgUserAuthData* PDlgUserAuthData; From 4054d2f3ea41e4d3c65a9ca6355efc8b4409680d Mon Sep 17 00:00:00 2001 From: Oswald's Arbitrary Domiciles Date: Thu, 2 Jul 2026 13:52:40 -0400 Subject: [PATCH 3/3] Adding option to User Auth action to use provided credentials as the OSDJoin username and password. --- UI++/Constants.h | 2 +- UI++/Dialogs/DlgUserAuth.cpp | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/UI++/Constants.h b/UI++/Constants.h index 221dae4..89312e8 100644 --- a/UI++/Constants.h +++ b/UI++/Constants.h @@ -408,7 +408,7 @@ const _TCHAR* const VAR_IPSUBNETMASK = (_T("XIPSubnetMask")); const _TCHAR* const VAR_MACADDRESS = (_T("XMACAddress")); const _TCHAR* const VAR_OSDJOINPASS = (_T("OSDJoinPassword")); -const _TCHAR* const VAR_OSDJOINACCOUNT = ` (_T("OSDJoinAccount")); +const _TCHAR* const VAR_OSDJOINACCOUNT = (_T("OSDJoinAccount")); const _TCHAR* const VAR_BLACKSLASH = (_T("\\")); const _TCHAR* const VALUE_OSVERSION_PE = (_T("PE")); diff --git a/UI++/Dialogs/DlgUserAuth.cpp b/UI++/Dialogs/DlgUserAuth.cpp index 1312fd8..664562c 100644 --- a/UI++/Dialogs/DlgUserAuth.cpp +++ b/UI++/Dialogs/DlgUserAuth.cpp @@ -111,18 +111,6 @@ void CDlgUserAuth::OnBnClickedNextaction() m_actionData.pLdap->Authenticate(pUser, pPass, pDom, pDC, m_pData->m_doNotFallback); - if (m_pData->m_useForOSDJoin == true) - { - //I am not very good with C++ - there is probably a better way to do this. - _tcscat_s(pOSDUser, MAX_STRING_LENGTH, pDom); - _tcscat_s(pOSDUser, MAX_STRING_LENGTH, VAR_BLACKSLASH); - _tcscat_s(pOSDUser, MAX_STRING_LENGTH, pUser); - CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_OSDJOINACCOUNT, pOSDUser, true); - CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_OSDJOINPASS, pPass, FALSE); - } - - SecureZeroMemory(pPass, sizeof(TCHAR) * (MAX_STRING_LENGTH - 1)); - m_actionData.pCMLog->WriteMsg(FTWCMLOG::CCMLog::MsgType::Info, AfxGetThread()->m_nThreadID, __TFILE__, __LINE__, FTW::FormatResourceString(IDS_LOGMSG_USERAUTH, pUser, pDom, ldap_err2string(LDAP_SUCCESS), pCount)); @@ -162,7 +150,17 @@ void CDlgUserAuth::OnBnClickedNextaction() if (groupMembershipOK && m_pData->m_getGroups) CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_AUTHUSERGROUPS, m_actionData.pLdap->ExtractGroupNamesFromAttributeList(ppAttributeVal)); - + if (m_pData->m_useForOSDJoin == true) + { + //I am not very good at C++ - there is probably a better way to do this. + _tcscpy_s(pOSDUser, MAX_STRING_LENGTH, pDom); + _tcscat_s(pOSDUser, MAX_STRING_LENGTH, VAR_BLACKSLASH); + _tcscat_s(pOSDUser, MAX_STRING_LENGTH, pUser); + CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_OSDJOINACCOUNT, pOSDUser, true); + CTSEnv::Instance().Set(m_actionData.pCMLog, VAR_OSDJOINPASS, pPass, false); + } + //Have to delay the secure erase so the password can be captured for task sequence variable OSDJoinPassword + SecureZeroMemory(pPass, sizeof(TCHAR) * (MAX_STRING_LENGTH - 1)); } else { @@ -180,6 +178,8 @@ void CDlgUserAuth::OnBnClickedNextaction() } } + + SecureZeroMemory(pPass, sizeof(TCHAR) * (MAX_STRING_LENGTH - 1)); if (groupMembershipOK && !m_fatalAuthError) { @@ -244,7 +244,7 @@ void CDlgUserAuth::OnBnClickedNextaction() delete[] pUser; delete[] pDom; delete[] pCount; - + delete[] pOSDUser; } void CDlgUserAuth::DisplayFinalError(DWORD msg)