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.

275 lines
7.5 KiB

  1. #include "stdafx.h"
  2. // #include <windows.h>
  3. #include <lm.h>
  4. #include <dsrole.h>
  5. NET_API_STATUS GetDomainUsersSid(OUT PSID *ppSid);
  6. DWORD GetWellKnownName(IN DWORD dwRID, OUT WCHAR **pszName);
  7. /*****************************************************************************
  8. *
  9. * RemoveAllFromRDUsersGroup
  10. *
  11. * Removes all entries from "Remote Desktop Users" group
  12. *
  13. * ENTRY:
  14. * none
  15. *
  16. *
  17. * NOTES:
  18. *
  19. *
  20. * EXIT:
  21. * Returns: 0 if success, error code if failure
  22. *
  23. *
  24. *
  25. ****************************************************************************/
  26. DWORD
  27. RemoveAllFromRDUsersGroup()
  28. {
  29. NET_API_STATUS Result,Result1;
  30. //Get "Remote Desktop Users" group name.
  31. //It may be different in different languages
  32. WCHAR *szRemoteGroupName = NULL;
  33. Result = GetWellKnownName(DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS, &szRemoteGroupName);
  34. if(Result == NERR_Success)
  35. {
  36. //Copy members of "Users" group to "Remote Desktop Users" group
  37. PLOCALGROUP_MEMBERS_INFO_0 plmi0 = NULL;
  38. DWORD entriesread = 0;
  39. DWORD totalentries = 0;
  40. DWORD_PTR resumehandle = 0;
  41. do
  42. {
  43. Result = NetLocalGroupGetMembers(NULL,szRemoteGroupName,0,(LPBYTE *)&plmi0,
  44. 1000,&entriesread,
  45. &totalentries,&resumehandle);
  46. if((Result == NERR_Success || Result == ERROR_MORE_DATA) &&
  47. entriesread)
  48. {
  49. for(DWORD i=0;i<entriesread;i++)
  50. {
  51. //We have to add users one by one because of the stupid behaviour
  52. //of this function, not allowing to add users if some of them are already
  53. //members of the group.
  54. Result1 = NetLocalGroupDelMembers(NULL,szRemoteGroupName,0,(LPBYTE)&plmi0[i],1);
  55. if(Result1 != ERROR_SUCCESS && Result1 != ERROR_MEMBER_IN_ALIAS)
  56. {
  57. LOGMESSAGE1(_T("NetLocalGroupDelMembers failed %d\n"),Result1);
  58. break;
  59. }
  60. }
  61. NetApiBufferFree(plmi0);
  62. if(Result1 != ERROR_SUCCESS && Result1 != ERROR_MEMBER_IN_ALIAS)
  63. {
  64. Result = Result1;
  65. break;
  66. }
  67. }
  68. }while (Result == ERROR_MORE_DATA);
  69. delete szRemoteGroupName;
  70. }
  71. else
  72. {
  73. LOGMESSAGE1(_T("GetWellKnownName(DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS) failed %d\n"),Result);
  74. }
  75. return Result;
  76. }
  77. /*****************************************************************************
  78. *
  79. * CopyUsersGroupToRDUsersGroup
  80. *
  81. * Copies all members of "Users" group to "Remote Desktop Users" group
  82. *
  83. * ENTRY:
  84. * none
  85. *
  86. *
  87. * NOTES:
  88. *
  89. *
  90. * EXIT:
  91. * Returns: 0 if success, error code if failure
  92. *
  93. *
  94. *
  95. ****************************************************************************/
  96. DWORD
  97. CopyUsersGroupToRDUsersGroup()
  98. {
  99. NET_API_STATUS Result,Result1;
  100. //Get real name of "Users" group
  101. //It may be different in different languages
  102. WCHAR *szUsersName = NULL;
  103. Result = GetWellKnownName(DOMAIN_ALIAS_RID_USERS, &szUsersName);
  104. if(Result != NERR_Success)
  105. {
  106. LOGMESSAGE1(_T("GetWellKnownName(DOMAIN_ALIAS_RID_USERS) failed %d\n"),Result);
  107. return Result;
  108. }
  109. //Get "Remote Desktop Users" group name.
  110. //It may be different in different languages
  111. WCHAR *szRemoteGroupName = NULL;
  112. Result = GetWellKnownName(DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS, &szRemoteGroupName);
  113. if(Result == NERR_Success)
  114. {
  115. //Copy members of "Users" group to "Remote Desktop Users" group
  116. PLOCALGROUP_MEMBERS_INFO_0 plmi0 = NULL;
  117. DWORD entriesread = 0;
  118. DWORD totalentries = 0;
  119. DWORD_PTR resumehandle = 0;
  120. do
  121. {
  122. Result = NetLocalGroupGetMembers(NULL,szUsersName,0,(LPBYTE *)&plmi0,
  123. 1000,&entriesread,
  124. &totalentries,&resumehandle);
  125. if((Result == NERR_Success || Result == ERROR_MORE_DATA) &&
  126. entriesread)
  127. {
  128. for(DWORD i=0;i<entriesread;i++)
  129. {
  130. //We have to add users one by one because of the stupid behaviour
  131. //of this function, not allowing to add users if some of them are already
  132. //members of the group.
  133. Result1 = NetLocalGroupAddMembers(NULL,szRemoteGroupName,0,(LPBYTE)&plmi0[i],1);
  134. if(Result1 != ERROR_SUCCESS && Result1 != ERROR_MEMBER_IN_ALIAS)
  135. {
  136. LOGMESSAGE1(_T("NetLocalGroupAddMembers failed %d\n"),Result1);
  137. break;
  138. }
  139. }
  140. NetApiBufferFree(plmi0);
  141. if(Result1 != ERROR_SUCCESS && Result1 != ERROR_MEMBER_IN_ALIAS)
  142. {
  143. Result = Result1;
  144. break;
  145. }
  146. }
  147. }while (Result == ERROR_MORE_DATA);
  148. delete szRemoteGroupName;
  149. }
  150. else
  151. {
  152. LOGMESSAGE1(_T("GetWellKnownName(DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS) failed %d\n"),Result);
  153. }
  154. delete szUsersName;
  155. return Result;
  156. }
  157. /*****************************************************************************
  158. *
  159. * GetWellKnownName
  160. *
  161. * Returns a real name of any well-known account
  162. *
  163. * ENTRY:
  164. * IN DWORD dwRID
  165. * OUT WCHAR **pszName
  166. *
  167. *
  168. * NOTES:
  169. * To free returned buffer use "delete" operator.
  170. *
  171. * EXIT:
  172. * Returns: NERR_Success if success, error code if failure
  173. *
  174. *
  175. *
  176. ****************************************************************************/
  177. DWORD
  178. GetWellKnownName(
  179. IN DWORD dwRID,
  180. OUT WCHAR **pszName)
  181. {
  182. SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
  183. PSID pSid=NULL;
  184. if( !AllocateAndInitializeSid( &sia, 2,
  185. SECURITY_BUILTIN_DOMAIN_RID,
  186. dwRID,
  187. 0, 0, 0, 0, 0, 0,&pSid ) )
  188. {
  189. return GetLastError();
  190. }
  191. //Lookup name
  192. WCHAR *szDomainName = NULL;
  193. DWORD cName = MAX_PATH;
  194. DWORD cDomainName = MAX_PATH;
  195. SID_NAME_USE eUse;
  196. DWORD Result = NERR_Success;
  197. for(int i=0; i<2; i++)
  198. {
  199. Result = NERR_Success;
  200. *pszName = new WCHAR[cName];
  201. if(!(*pszName))
  202. {
  203. Result = ERROR_NOT_ENOUGH_MEMORY;
  204. break;
  205. }
  206. szDomainName = new WCHAR[cDomainName];
  207. if(!szDomainName)
  208. {
  209. delete *pszName;
  210. *pszName = NULL;
  211. Result = ERROR_NOT_ENOUGH_MEMORY;
  212. break;
  213. }
  214. if(!LookupAccountSidW(NULL,pSid,
  215. *pszName,&cName,
  216. szDomainName,&cDomainName,
  217. &eUse))
  218. {
  219. delete *pszName;
  220. delete szDomainName;
  221. *pszName = NULL;
  222. szDomainName = NULL;
  223. Result = GetLastError();
  224. if(Result == ERROR_INSUFFICIENT_BUFFER)
  225. {
  226. continue;
  227. }
  228. else
  229. {
  230. break;
  231. }
  232. }
  233. break;
  234. }
  235. if(szDomainName)
  236. {
  237. delete szDomainName;
  238. }
  239. FreeSid(pSid);
  240. return Result;
  241. }