Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
5.6 KiB

  1. #include "stdafx.h"
  2. #include "resource.h"
  3. #pragma hdrstop
  4. // group list management
  5. CGroupInfoList::CGroupInfoList()
  6. {
  7. }
  8. CGroupInfoList::~CGroupInfoList()
  9. {
  10. if (HDPA())
  11. DestroyCallback(DestroyGroupInfoCallback, NULL);
  12. }
  13. int CGroupInfoList::DestroyGroupInfoCallback(CGroupInfo* pGroupInfo, LPVOID pData)
  14. {
  15. delete pGroupInfo;
  16. return 1;
  17. }
  18. HRESULT CGroupInfoList::Initialize()
  19. {
  20. HRESULT hr = S_OK;
  21. NET_API_STATUS status;
  22. DWORD_PTR dwResumeHandle = 0;
  23. DWORD dwEntriesRead = 0;
  24. DWORD dwTotalEntries = 0;
  25. if (HDPA())
  26. DestroyCallback(DestroyGroupInfoCallback, NULL);
  27. // Create new list initially with 8 items
  28. if (Create(8))
  29. {
  30. // Now begin enumerating local groups
  31. LOCALGROUP_INFO_1* prgGroupInfo;
  32. // Read each local group
  33. BOOL fBreakLoop = FALSE;
  34. while (!fBreakLoop)
  35. {
  36. status = NetLocalGroupEnum(NULL, 1, (BYTE**) &prgGroupInfo,
  37. 8192, &dwEntriesRead, &dwTotalEntries,
  38. &dwResumeHandle);
  39. if ((status == NERR_Success) || (status == ERROR_MORE_DATA))
  40. {
  41. // We got some local groups - add information for all users in these local
  42. // groups to our list
  43. DWORD iGroup;
  44. for (iGroup = 0; iGroup < dwEntriesRead; iGroup ++)
  45. {
  46. AddGroupToList(prgGroupInfo[iGroup].lgrpi1_name,
  47. prgGroupInfo[iGroup].lgrpi1_comment);
  48. }
  49. NetApiBufferFree((BYTE*) prgGroupInfo);
  50. // Maybe we don't have to try NetLocalGroupEnum again (if we got all the groups)
  51. fBreakLoop = (dwEntriesRead == dwTotalEntries);
  52. }
  53. else
  54. {
  55. fBreakLoop = TRUE;
  56. hr = E_FAIL;
  57. }
  58. }
  59. }
  60. else
  61. {
  62. hr = E_OUTOFMEMORY;
  63. }
  64. return hr;
  65. }
  66. HRESULT CGroupInfoList::AddGroupToList(LPCTSTR szGroup, LPCTSTR szComment)
  67. {
  68. CGroupInfo* pGroupInfo = new CGroupInfo();
  69. if (!pGroupInfo)
  70. return E_OUTOFMEMORY;
  71. StrCpyN(pGroupInfo->m_szGroup, szGroup, ARRAYSIZE(pGroupInfo->m_szGroup));
  72. StrCpyN(pGroupInfo->m_szComment, szComment, ARRAYSIZE(pGroupInfo->m_szComment));
  73. return (-1 != AppendPtr(pGroupInfo)) ? S_OK : E_OUTOFMEMORY;
  74. }
  75. // user data manager
  76. CUserManagerData::CUserManagerData(LPCTSTR pszCurrentDomainUser)
  77. {
  78. m_szHelpfilePath[0] = TEXT('\0');
  79. // Initialize everything except for the user loader thread
  80. // and the group list here; the rest is done in
  81. // ::Initialize.
  82. // Fill in the computer name
  83. DWORD cchComputername = ARRAYSIZE(m_szComputername);
  84. ::GetComputerName(m_szComputername, &cchComputername);
  85. // Detect if 'puter is in a domain
  86. SetComputerDomainFlag();
  87. // Get the current user information
  88. DWORD cchUsername = ARRAYSIZE(m_LoggedOnUser.m_szUsername);
  89. DWORD cchDomain = ARRAYSIZE(m_LoggedOnUser.m_szDomain);
  90. GetCurrentUserAndDomainName(m_LoggedOnUser.m_szUsername, &cchUsername,
  91. m_LoggedOnUser.m_szDomain, &cchDomain);
  92. // Get the extra data for this user
  93. m_LoggedOnUser.GetExtraUserInfo();
  94. // We'll set logoff required only if the current user has been updated
  95. m_pszCurrentDomainUser = (LPTSTR) pszCurrentDomainUser;
  96. m_fLogoffRequired = FALSE;
  97. }
  98. CUserManagerData::~CUserManagerData()
  99. {
  100. }
  101. HRESULT CUserManagerData::Initialize(HWND hwndUserListPage)
  102. {
  103. CWaitCursor cur;
  104. m_GroupList.Initialize();
  105. m_UserListLoader.Initialize(hwndUserListPage);
  106. return S_OK;
  107. }
  108. // Registry access constants for auto admin logon
  109. static const TCHAR szWinlogonSubkey[] = TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
  110. static const TCHAR szAutologonValueName[] = TEXT("AutoAdminLogon");
  111. static const TCHAR szDefaultUserNameValueName[] = TEXT("DefaultUserName");
  112. static const TCHAR szDefaultDomainValueName[] = TEXT("DefaultDomainName");
  113. static const TCHAR szDefaultPasswordValueName[] = TEXT("DefaultPassword");
  114. BOOL CUserManagerData::IsAutologonEnabled()
  115. {
  116. BOOL fAutologon = FALSE;
  117. // Read the registry to see if autologon is enabled
  118. HKEY hkey;
  119. if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szWinlogonSubkey, 0, KEY_QUERY_VALUE, &hkey) == ERROR_SUCCESS)
  120. {
  121. TCHAR szResult[2];
  122. DWORD dwType;
  123. DWORD cbSize = sizeof(szResult);
  124. if (RegQueryValueEx(hkey, szAutologonValueName, 0, &dwType, (BYTE*) szResult, &cbSize) == ERROR_SUCCESS)
  125. {
  126. long lResult = StrToLong(szResult);
  127. fAutologon = (lResult != 0);
  128. }
  129. RegCloseKey(hkey);
  130. }
  131. return (fAutologon);
  132. }
  133. void CUserManagerData::SetComputerDomainFlag()
  134. {
  135. m_fInDomain = ::IsComputerInDomain();
  136. }
  137. TCHAR* CUserManagerData::GetHelpfilePath()
  138. {
  139. static const TCHAR szHelpfileUnexpanded[] = TEXT("%systemroot%\\system32\\users.hlp");
  140. if (m_szHelpfilePath[0] == TEXT('\0'))
  141. {
  142. ExpandEnvironmentStrings(szHelpfileUnexpanded, m_szHelpfilePath,
  143. ARRAYSIZE(m_szHelpfilePath));
  144. }
  145. return (m_szHelpfilePath);
  146. }
  147. void CUserManagerData::UserInfoChanged(LPCTSTR pszUser, LPCTSTR pszDomain)
  148. {
  149. TCHAR szDomainUser[MAX_USER + MAX_DOMAIN + 2]; szDomainUser[0] = 0;
  150. MakeDomainUserString(pszDomain, pszUser, szDomainUser, ARRAYSIZE(szDomainUser));
  151. if (StrCmpI(szDomainUser, m_pszCurrentDomainUser) == 0)
  152. {
  153. m_fLogoffRequired = TRUE;
  154. }
  155. }
  156. BOOL CUserManagerData::LogoffRequired()
  157. {
  158. return (m_fLogoffRequired);
  159. }