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.

298 lines
7.1 KiB

  1. /******************************************************************************
  2. *
  3. * CHGUSR.C
  4. *
  5. * Text utility to change INI file mapping settings
  6. *
  7. * Copyright (c) 1998-1999 Microsoft Corporation
  8. *
  9. *
  10. *******************************************************************************/
  11. #include "precomp.h"
  12. #include <ntddkbd.h>
  13. #include <winsta.h>
  14. #include <syslib.h>
  15. #include <assert.h>
  16. #include <stdlib.h>
  17. #include <time.h>
  18. #include <utilsub.h>
  19. #include <string.h>
  20. #include <malloc.h>
  21. #include <locale.h>
  22. #include <winnlsp.h>
  23. #include "chgusr.h"
  24. #include "winbasep.h"
  25. #include "regapi.h"
  26. #if DBG
  27. ULONG
  28. DbgPrint(
  29. PCH Format,
  30. ...
  31. );
  32. #define DBGPRINT(x) DbgPrint x
  33. #if DBGTRACE
  34. #define TRACE0(x) DbgPrint x
  35. #define TRACE1(x) DbgPrint x
  36. #else
  37. #define TRACE0(x)
  38. #define TRACE1(x)
  39. #endif
  40. #else
  41. #define DBGPRINT(x)
  42. #define TRACE0(x)
  43. #define TRACE1(x)
  44. #endif
  45. // max length of the locale string
  46. #define MAX_LOCALE_STRING 64
  47. WCHAR Arg1[MAX_IDS_LEN+1];
  48. int On_flag = FALSE;
  49. int Off_flag = FALSE;
  50. int Query_flag = FALSE;
  51. int Help_flag = FALSE;
  52. int Install_flag = FALSE;
  53. int Execute_flag = FALSE;
  54. TOKMAPW ptm[] = {
  55. {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, Arg1},
  56. {L"/INIMAPPING:ON", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &On_flag},
  57. {L"/INIMAPPING:OFF", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &Off_flag},
  58. {L"/QUERY", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &Query_flag},
  59. {L"/Q", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &Query_flag},
  60. {L"/INSTALL", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &Install_flag},
  61. {L"/EXECUTE", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &Execute_flag},
  62. {L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &Help_flag},
  63. {0, 0, 0, 0, 0}
  64. };
  65. BOOL IsRemoteAdminMode( );
  66. BOOL
  67. TestUserForAdmin( VOID );
  68. /*******************************************************************************
  69. *
  70. * main
  71. *
  72. ******************************************************************************/
  73. int __cdecl
  74. main(INT argc, CHAR **argv)
  75. {
  76. WCHAR **argvW;
  77. ULONG rc;
  78. int i;
  79. BOOL Result;
  80. BOOL State;
  81. HANDLE hWin;
  82. WCHAR wszString[MAX_LOCALE_STRING + 1];
  83. setlocale(LC_ALL, ".OCP");
  84. // We don't want LC_CTYPE set the same as the others or else we will see
  85. // garbage output in the localized version, so we need to explicitly
  86. // set it to correct console output code page
  87. _snwprintf(wszString, sizeof(wszString)/sizeof(WCHAR), L".%d", GetConsoleOutputCP());
  88. wszString[sizeof(wszString)/sizeof(WCHAR) - 1] = L'\0';
  89. _wsetlocale(LC_CTYPE, wszString);
  90. SetThreadUILanguage(0);
  91. /*
  92. * Massage the command line.
  93. */
  94. argvW = MassageCommandLine((DWORD)argc);
  95. if (argvW == NULL) {
  96. ErrorPrintf(IDS_ERROR_MALLOC);
  97. return(FAILURE);
  98. }
  99. /*
  100. * parse the cmd line without parsing the program name (argc-1, argv+1)
  101. */
  102. rc = ParseCommandLine(argc-1, argvW+1, ptm, 0);
  103. /*
  104. * Check for error from ParseCommandLine
  105. */
  106. if ( Help_flag || (rc && !(rc & PARSE_FLAG_NO_PARMS)) ) {
  107. if ( !Help_flag ) {
  108. // International
  109. ErrorPrintf(IDS_ERROR_INVALID_PARAMETERS);
  110. ErrorPrintf(IDS_HELP_USAGE1);
  111. ErrorPrintf(IDS_HELP_USAGE2);
  112. ErrorPrintf(IDS_HELP_USAGE3);
  113. ErrorPrintf(IDS_HELP_USAGE4);
  114. ErrorPrintf(IDS_HELP_USAGE5);
  115. return(FAILURE);
  116. } else {
  117. Message(IDS_HELP_USAGE1);
  118. Message(IDS_HELP_USAGE2);
  119. Message(IDS_HELP_USAGE3);
  120. Message(IDS_HELP_USAGE4);
  121. Message(IDS_HELP_USAGE5);
  122. return(SUCCESS);
  123. }
  124. }
  125. if(!AreWeRunningTerminalServices())
  126. {
  127. ErrorPrintf(IDS_ERROR_NOT_TS);
  128. return(FAILURE);
  129. }
  130. if( Query_flag ) {
  131. // Show the current state
  132. State = TermsrvAppInstallMode();
  133. if( !State ) {
  134. Message(IDS_EXECUTE);
  135. }
  136. else {
  137. Message(IDS_INSTALL);
  138. }
  139. if( IsRemoteAdminMode( ) )
  140. {
  141. Message( IDS_ERROR_REMOTE_ADMIN );
  142. }
  143. return( !State + 100 ); // Exit code 100 == INSTALL Mode
  144. // Exit Code 101 == EXECUTE Mode
  145. }
  146. /*
  147. * Set the modes necessary to install applications
  148. */
  149. if ( Install_flag ) {
  150. On_flag = FALSE;
  151. Off_flag = TRUE;
  152. }
  153. /*
  154. * Set the modes necessary to run applications
  155. */
  156. if ( Execute_flag ) {
  157. On_flag = TRUE;
  158. Off_flag = FALSE;
  159. }
  160. // Default to Execute mode
  161. State = TRUE;
  162. if( On_flag || Off_flag ) {
  163. if( IsRemoteAdminMode( ) ) {
  164. Message( IDS_ERROR_REMOTE_ADMIN );
  165. return SUCCESS;
  166. }
  167. if( Off_flag ) {
  168. /*
  169. * We only allow admins to turn off execute mode
  170. */
  171. if( !TestUserForAdmin() ) {
  172. ErrorPrintf(IDS_ERROR_ADMIN_ONLY);
  173. return(FAILURE);
  174. }
  175. State = FALSE;
  176. }
  177. rc = SetTermsrvAppInstallMode( (BOOL)(!State) );
  178. if( !rc ) {
  179. // Use function to map error message to string
  180. ErrorPrintf(IDS_ERROR_INI_MAPPING_FAILED,GetLastError());
  181. return(!rc);
  182. } else {
  183. if ( Off_flag )
  184. Message(IDS_READY_INSTALL);
  185. if ( On_flag )
  186. Message(IDS_READY_EXECUTE);
  187. }
  188. }
  189. else {
  190. Message(IDS_HELP_USAGE1);
  191. Message(IDS_HELP_USAGE2);
  192. Message(IDS_HELP_USAGE3);
  193. Message(IDS_HELP_USAGE4);
  194. Message(IDS_HELP_USAGE5);
  195. return(FAILURE);
  196. }
  197. if( IsRemoteAdminMode( ) )
  198. {
  199. Message( IDS_ERROR_REMOTE_ADMIN );
  200. }
  201. return( !rc );
  202. }
  203. BOOL IsRemoteAdminMode( )
  204. {
  205. HKEY hKey;
  206. DWORD dwData = 0;
  207. BOOL fMode = FALSE;
  208. DWORD dwSize = sizeof( DWORD );
  209. DBGPRINT( ( "CHGUSR : IsRemoteAdminMode\n" ) );
  210. if( RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
  211. REG_CONTROL_TSERVER,
  212. 0,
  213. KEY_READ ,
  214. &hKey ) != ERROR_SUCCESS )
  215. {
  216. DBGPRINT( ( "CHGUSR : IsRemoteAdminMode -- RegOpenEx unable to open key\n" ) );
  217. return FALSE;
  218. }
  219. if( RegQueryValueEx( hKey ,
  220. TEXT( "TSAppCompat" ) ,
  221. NULL ,
  222. NULL ,
  223. ( LPBYTE )&dwData ,
  224. &dwSize ) != ERROR_SUCCESS )
  225. {
  226. DBGPRINT( ( "CHGUSR : IsRemoteAdminMode -- RegQueryValueEx failed\n" ) );
  227. fMode = FALSE; // for application server
  228. }
  229. else
  230. {
  231. // dwData = 0 fMode = TRUE remote admin mode
  232. // dwData = 1 fMode = FALSE app server mode
  233. fMode = !( BOOL )dwData;
  234. }
  235. RegCloseKey( hKey );
  236. return fMode;
  237. }