Source code of Windows XP (NT5)
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.

222 lines
6.0 KiB

  1. // nusrmgr.cpp : Implementation of WinMain
  2. #include "stdafx.h"
  3. #include "resource.h"
  4. #include <initguid.h>
  5. #include "nusrmgr.h"
  6. #include "nusrmgr_i.c"
  7. #include <lmaccess.h> // for NetUserModalsGet
  8. #include <lmapibuf.h> // for NetApiBufferFree
  9. #include <lmerr.h> // for NERR_Success
  10. #include "PageFact.h"
  11. #include "MainPage.h"
  12. //#include "UserPage.h"
  13. //#include "LogonPage.h"
  14. WCHAR g_szAdminName[MAX_PATH];
  15. WCHAR g_szGuestName[MAX_PATH];
  16. CComModule _Module;
  17. BEGIN_OBJECT_MAP(ObjectMap)
  18. //OBJECT_ENTRY(CLSID_MainPage, CMainPage)
  19. //OBJECT_ENTRY(CLSID_UserPage, CUserPage)
  20. //OBJECT_ENTRY(CLSID_LogonPage, CLogonPage)
  21. END_OBJECT_MAP()
  22. DWORD BuildAccountSidFromRid(LPCWSTR pszServer, DWORD dwRid, PSID* ppSid)
  23. {
  24. DWORD dwErr = ERROR_SUCCESS;
  25. PUSER_MODALS_INFO_2 umi2;
  26. NET_API_STATUS nasRet;
  27. *ppSid = NULL;
  28. // Get the account domain Sid on the target machine
  29. nasRet = NetUserModalsGet(pszServer, 2, (LPBYTE*)&umi2);
  30. if ( nasRet == NERR_Success )
  31. {
  32. UCHAR cSubAuthorities;
  33. PSID pSid;
  34. cSubAuthorities = *GetSidSubAuthorityCount(umi2->usrmod2_domain_id);
  35. // Allocate storage for new the Sid (domain Sid + account Rid)
  36. pSid = (PSID)LocalAlloc(LPTR, GetSidLengthRequired((UCHAR)(cSubAuthorities+1)));
  37. if ( pSid != NULL )
  38. {
  39. if ( InitializeSid(pSid,
  40. GetSidIdentifierAuthority(umi2->usrmod2_domain_id),
  41. (BYTE)(cSubAuthorities+1)) )
  42. {
  43. // Copy existing subauthorities from domain Sid to new Sid
  44. for (UINT i = 0; i < cSubAuthorities; i++)
  45. {
  46. *GetSidSubAuthority(pSid, i) = *GetSidSubAuthority(umi2->usrmod2_domain_id, i);
  47. }
  48. // Append Rid to new Sid
  49. *GetSidSubAuthority(pSid, cSubAuthorities) = dwRid;
  50. *ppSid = pSid;
  51. }
  52. else
  53. {
  54. dwErr = GetLastError();
  55. LocalFree(pSid);
  56. }
  57. }
  58. else
  59. {
  60. dwErr = GetLastError();
  61. }
  62. NetApiBufferFree(umi2);
  63. }
  64. else
  65. {
  66. dwErr = nasRet;
  67. }
  68. return dwErr;
  69. }
  70. BOOL GetAccountNameFromRid(LPCWSTR pszServer, DWORD dwRid, LPWSTR pszName, DWORD cchName)
  71. {
  72. BOOL bResult = FALSE;
  73. PSID pSid;
  74. pszName[0] = L'\0';
  75. if (NOERROR == BuildAccountSidFromRid(pszServer, dwRid, &pSid))
  76. {
  77. WCHAR szDomain[DNLEN+1];
  78. DWORD cchDomain = ARRAYSIZE(szDomain);
  79. SID_NAME_USE snu;
  80. bResult = LookupAccountSidW(pszServer, pSid, pszName, &cchName, szDomain, &cchDomain, &snu);
  81. LocalFree(pSid);
  82. }
  83. return bResult;
  84. }
  85. HRESULT ShowUserAccounts()
  86. {
  87. HRESULT hr;
  88. CComPtr<ITaskSheet> spTaskSheet;
  89. hr = spTaskSheet.CoCreateInstance(__uuidof(TaskSheet));
  90. if (SUCCEEDED(hr))
  91. {
  92. CComPtr<IPropertyBag> spProps = NULL;
  93. hr = spTaskSheet->GetPropertyBag(IID_IPropertyBag, (void**)&spProps);
  94. if (SUCCEEDED(hr))
  95. {
  96. WCHAR szTitle[MAX_PATH];
  97. LoadStringW(_Module.GetResourceInstance(), IDS_UA_TITLE, szTitle, ARRAYSIZE(szTitle));
  98. CComVariant var(szTitle);
  99. spProps->Write(TS_PROP_TITLE, &var);
  100. var = 750;
  101. spProps->Write(TS_PROP_WIDTH, &var);
  102. var = 500;
  103. spProps->Write(TS_PROP_HEIGHT, &var);
  104. var = 600;
  105. spProps->Write(TS_PROP_MINWIDTH, &var);
  106. var = 400;
  107. spProps->Write(TS_PROP_MINHEIGHT, &var);
  108. LPWSTR pszTemp = FormatString(L"res://nusrmgr.exe/%d/%d", RT_BITMAP, IDB_WATERMARK);
  109. if (NULL != pszTemp)
  110. {
  111. var = pszTemp;
  112. spProps->Write(TS_PROP_WATERMARK, &var);
  113. LocalFree(pszTemp);
  114. }
  115. var = false;
  116. spProps->Write(TS_PROP_MODELESS, &var);
  117. spProps->Write(TS_PROP_STATUSBAR, &var);
  118. var = true;
  119. spProps->Write(TS_PROP_RESIZABLE, &var);
  120. //try
  121. //{
  122. // var oThemeManager = new ActiveXObject("Theme.Manager");
  123. // css = objThemeManger.WebviewCSS;
  124. //}
  125. //catch (e)
  126. //{
  127. // css = "res://webvw.dll/cpwebvw.css";
  128. //}
  129. var = L"res://webvw.dll/cpwebvw.css";
  130. spProps->Write(UA_PROP_CSSPATH, &var);
  131. CComPtr<ILogonEnumUsers> spUserList;
  132. hr = spUserList.CoCreateInstance(CLSID_ShellLogonEnumUsers);
  133. if (SUCCEEDED(hr))
  134. {
  135. var = (IUnknown*)spUserList;
  136. spProps->Write(UA_PROP_USERLIST, &var);
  137. CComPtr<ITaskPageFactory> spPageFactory;
  138. hr = CPageFactory::CreateInstance(&spPageFactory);
  139. if (SUCCEEDED(hr))
  140. {
  141. hr = spTaskSheet->Run(spPageFactory, CLSID_MainPage, NULL);
  142. }
  143. }
  144. }
  145. }
  146. return hr;
  147. }
  148. /////////////////////////////////////////////////////////////////////////////
  149. //
  150. extern "C" int WINAPI WinMain(HINSTANCE hInstance,
  151. HINSTANCE /*hPrevInstance*/,
  152. LPSTR /*lpCmdLine*/,
  153. int /*nShowCmd*/)
  154. {
  155. #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
  156. HRESULT hrCom = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  157. #else
  158. HRESULT hrCom = CoInitialize(NULL);
  159. #endif
  160. _Module.Init(ObjectMap, hInstance);
  161. _Module.RegisterTypeLib();
  162. if (!GetAccountNameFromRid(NULL, DOMAIN_USER_RID_ADMIN, g_szAdminName, ARRAYSIZE(g_szAdminName)))
  163. LoadStringW(hInstance, IDS_ADMINNAME, g_szAdminName, ARRAYSIZE(g_szAdminName));
  164. if (!GetAccountNameFromRid(NULL, DOMAIN_USER_RID_GUEST, g_szGuestName, ARRAYSIZE(g_szGuestName)))
  165. LoadStringW(hInstance, IDS_GUESTNAME, g_szGuestName, ARRAYSIZE(g_szGuestName));
  166. ShowUserAccounts();
  167. _Module.Term();
  168. if (SUCCEEDED(hrCom))
  169. CoUninitialize();
  170. return 0;
  171. }