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.

1714 lines
47 KiB

  1. // Copyright (c) 1998 - 1999 Microsoft Corporation
  2. #include "stdafx.h"
  3. #include <iostream.h>
  4. #include <string>
  5. typedef std::basic_string<TCHAR> TString;
  6. #include <fstream.h>
  7. #include <strstrea.h>
  8. #include <dsrole.h>
  9. #include <dsgetdc.h>
  10. #include <wtsapi32.h>
  11. // #include <ostream>
  12. //#include <cstring>
  13. // #include <sstream>
  14. class ConstCRegistry : public CRegistry
  15. {
  16. public:
  17. DWORD OpenKey (HKEY hKey, LPCTSTR lpSubKey, REGSAM access = KEY_ALL_ACCESS, LPCTSTR lpMachineName = NULL);
  18. };
  19. DWORD ConstCRegistry::OpenKey(HKEY hKey, LPCTSTR lpSubKey, REGSAM access /*= KEY_ALL_ACCESS*/, LPCTSTR lpMachineName /*= NULL*/)
  20. {
  21. ASSERT(access == KEY_READ);
  22. return CRegistry::OpenKey(hKey, lpSubKey, KEY_READ, lpMachineName);
  23. }
  24. #define ConstCRegistry CRegistry
  25. //
  26. // global utilities and veraibles.
  27. //
  28. char szOutput[2048];
  29. ostrstream szMoreInfo(szOutput, 4096);
  30. TCHAR *ReturnBuffer()
  31. {
  32. static TCHAR szReturnTchar[512];
  33. return szReturnTchar;
  34. }
  35. const OSVERSIONINFOEX *GetOSVersionInfo()
  36. {
  37. static OSVERSIONINFOEX gOsVersion;
  38. static bGotOnce = FALSE;
  39. if (!bGotOnce)
  40. {
  41. ZeroMemory(&gOsVersion, sizeof(OSVERSIONINFOEX));
  42. gOsVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  43. GetVersionEx( (LPOSVERSIONINFO ) &gOsVersion);
  44. bGotOnce = TRUE;
  45. }
  46. return &gOsVersion;
  47. }
  48. // #include <strstream>
  49. #include "winsock2.h"
  50. // ostringstream sz
  51. #ifndef UNREFERENCED_PARAMETER
  52. #define UNREFERENCED_PARAMETER(P) (P)
  53. #endif
  54. #define OLD_VER_SET_CONDITION(_m_,_t_,_c_) _m_=(_m_|(_c_<<(1<<_t_)))
  55. BOOL CheckifBinaryisSigned (TCHAR *szFile); // from tscert.cpp
  56. BOOL EnumerateLicenseServers (); // from timebomb.cpp
  57. TCHAR *IsBetaSystem ();
  58. BOOL HasLicenceGracePeriodExpired (); // from timebomb.cpp
  59. BOOL ExtractAllTSEvents();
  60. BOOL ValidateProductSuite (LPSTR SuiteName);
  61. BOOL IsTerminalServicesEnabled ( VOID );
  62. DWORD IsStringInMultiString(HKEY hkey, LPCTSTR szkey, LPCTSTR szvalue, LPCTSTR szCheckForString, BOOL *pbFound);
  63. BOOL DoesHydraKeysExists ();
  64. TCHAR *IsServer ();
  65. BOOL IsKernelTSEnable ();
  66. BOOL TSEnabled ();
  67. BOOL DoesProductSuiteContainTS ();
  68. BOOL IsTerminalServerRegistryOk ();
  69. TCHAR *IsTerminalServiceStartBitSet ();
  70. BOOL IsTermDDStartBitSet ();
  71. BOOL GetTSOCLogFileName (char *strFileName, UINT uiSize);
  72. BOOL DidTsOCgetCompleteInstallationMessage ();
  73. BOOL FileExists (char *pszFullNameAndPath);
  74. BOOL IsTSOClogPresent ();
  75. BOOL DidOCMInstallTSEnable();
  76. TCHAR *IsClusteringInstalled ();
  77. BOOL IsRemoteAdminMode ();
  78. BOOL CheckModeRegistry (BOOL bAppCompat);
  79. BOOL IsTerminalServiceRunning ();
  80. BOOL CheckVideoKeys ();
  81. BOOL CheckModePermissions(DWORD *pdwSecurtyMode);
  82. BOOL IsFile128Bit(LPTSTR szFile, BOOL *pb128Bit);
  83. ULONG RDPDRINST_DetectInstall(); // defined in drdetect.cpp
  84. BOOL IsAudioOk( VOID );
  85. TCHAR *aszStack[] = {
  86. // _T("noexport\%SystemRoot%\\system32\\drivers\\rdpwdd.sys"),
  87. _T("%SystemRoot%\\system32\\drivers\\termdd.sys"),
  88. _T("%SystemRoot%\\system32\\drivers\\tdasync.sys"),
  89. _T("%SystemRoot%\\system32\\drivers\\tdipx.sys"),
  90. _T("%SystemRoot%\\system32\\drivers\\tdnetb.sys"),
  91. _T("%SystemRoot%\\system32\\drivers\\tdpipe.sys"),
  92. _T("%SystemRoot%\\system32\\drivers\\tdspx.sys"),
  93. _T("%SystemRoot%\\system32\\drivers\\tdtcp.sys"),
  94. _T("%SystemRoot%\\system32\\drivers\\rdpwd.sys"),
  95. _T("%SystemRoot%\\system32\\rdpdd.dll"),
  96. _T("%SystemRoot%\\system32\\rdpwsx.dll")
  97. };
  98. TCHAR Version[256];
  99. TCHAR *GetTSVersion()
  100. {
  101. CRegistry oRegTermsrv;
  102. DWORD cbVersion = 0;
  103. LPTSTR szVersion = NULL;
  104. if ((ERROR_SUCCESS == oRegTermsrv.OpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ)) &&
  105. (ERROR_SUCCESS == oRegTermsrv.ReadRegString(_T("ProductVersion"), &szVersion, &cbVersion)))
  106. {
  107. _tcscpy(Version, szVersion);
  108. return Version;
  109. }
  110. return _T("Error finding Version.");
  111. }
  112. BOOL IsIt50TS()
  113. {
  114. return (0 == _tcsicmp(Version, _T("5.0")));
  115. }
  116. BOOL IsIt51TS()
  117. {
  118. return (0 == _tcsicmp(Version, _T("5.1"))) || (0 == _tcsicmp(Version, _T("5.2")));
  119. }
  120. TCHAR *IsLicenceGracePeriodOk ()
  121. {
  122. return (HasLicenceGracePeriodExpired () ? _T("Yep, Its expired") : _T("Its Not expired"));
  123. }
  124. BOOL Check_termdd()
  125. {
  126. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\termdd.sys"));
  127. }
  128. BOOL Check_tdasync()
  129. {
  130. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\tdasync.sys"));
  131. }
  132. BOOL Check_tdipx()
  133. {
  134. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\tdipx.sys"));
  135. }
  136. BOOL Check_tdnetb()
  137. {
  138. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\tdnetb.sys"));
  139. }
  140. BOOL Check_tdpipe()
  141. {
  142. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\tdpipe.sys"));
  143. }
  144. BOOL Check_tdspx()
  145. {
  146. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\tdspx.sys"));
  147. }
  148. BOOL Check_tdtcp()
  149. {
  150. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\tdtcp.sys"));
  151. }
  152. BOOL Check_rdpwd()
  153. {
  154. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\drivers\\rdpwd.sys"));
  155. }
  156. BOOL Check_rdpdd()
  157. {
  158. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\rdpdd.dll"));
  159. }
  160. BOOL Check_rdpwsx()
  161. {
  162. return CheckifBinaryisSigned(_T("%SystemRoot%\\system32\\rdpwsx.dll"));
  163. }
  164. BOOL IsRdpDrInstalledProperly ()
  165. {
  166. bool bPersonal = (GetOSVersionInfo()->wSuiteMask & VER_SUITE_PERSONAL) != 0;
  167. bool bRdpdrInstalled = RDPDRINST_DetectInstall() != 0;
  168. return bPersonal != bRdpdrInstalled;
  169. }
  170. TCHAR *GetModePermissions()
  171. {
  172. CRegistry reg;
  173. DWORD dwSecurityMode;
  174. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ))
  175. {
  176. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("TSUserEnabled"), &dwSecurityMode))
  177. {
  178. if (dwSecurityMode == 0)
  179. {
  180. return _T("Its W2k Compatible");
  181. }
  182. else if (dwSecurityMode == 1)
  183. {
  184. return _T("Its TS4 Compatible");
  185. }
  186. else
  187. {
  188. szMoreInfo << "SYSTEM\\CurrentControlSet\\Control\\Terminal Server/TSUserEnabled has wrong value" << dwSecurityMode << endl;
  189. return NULL;
  190. }
  191. }
  192. }
  193. return NULL;
  194. }
  195. BOOL CheckModePermissions (DWORD *pdwSecurtyMode)
  196. {
  197. // PERM_WIN2K = 0,
  198. // PERM_TS4 = 1
  199. CRegistry reg;
  200. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ))
  201. {
  202. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("TSUserEnabled"), pdwSecurtyMode))
  203. {
  204. return (*pdwSecurtyMode== 0) || (*pdwSecurtyMode== 1);
  205. }
  206. }
  207. return FALSE;
  208. }
  209. TCHAR *GetCypherStrenthOnRdpwd ()
  210. {
  211. BOOL bFile128bit;
  212. if ( IsFile128Bit(_T("%SystemRoot%\\system32\\drivers\\rdpwd.sys"), &bFile128bit) )
  213. {
  214. return bFile128bit ? _T("128 Bit") : _T("56 Bit");
  215. }
  216. else
  217. {
  218. return NULL;
  219. }
  220. }
  221. BOOL IsFile128Bit(LPTSTR szFile, BOOL *pb128Bit)
  222. {
  223. USES_CONVERSION;
  224. DWORD dwHandle;
  225. TCHAR szFullFile[MAX_PATH +1];
  226. BOOL bSuccess = FALSE;
  227. if (ExpandEnvironmentStrings(szFile, szFullFile, MAX_PATH))
  228. {
  229. if (FileExists(T2A(szFullFile)))
  230. {
  231. DWORD dwSize = GetFileVersionInfoSize(szFullFile, &dwHandle);
  232. if (dwSize > 0)
  233. {
  234. BYTE *pbData = new BYTE[dwSize];
  235. if (pbData)
  236. {
  237. if (GetFileVersionInfo(szFullFile, 0, dwSize, pbData))
  238. {
  239. TCHAR *szFileDescription;
  240. UINT uiLen = 0;
  241. if (VerQueryValue(pbData, _T("\\StringFileInfo\\040904B0\\FileDescription"), (LPVOID *)&szFileDescription, &uiLen))
  242. {
  243. if (_tcsstr(szFileDescription, _T("Not for Export")))
  244. {
  245. *pb128Bit = TRUE;
  246. bSuccess = TRUE;
  247. }
  248. else if (_tcsstr(szFileDescription, _T("Export Version")))
  249. {
  250. *pb128Bit = FALSE;
  251. bSuccess = TRUE;
  252. }
  253. }
  254. }
  255. delete [] pbData;
  256. }
  257. }
  258. }
  259. }
  260. return bSuccess;
  261. }
  262. BOOL ValidateProductSuite (LPSTR SuiteName)
  263. {
  264. BOOL rVal = FALSE;
  265. LONG Rslt;
  266. HKEY hKey = NULL;
  267. DWORD Type = 0;
  268. DWORD Size = 0;
  269. LPSTR ProductSuite = NULL;
  270. LPSTR p;
  271. Rslt = RegOpenKeyA(
  272. HKEY_LOCAL_MACHINE,
  273. "System\\CurrentControlSet\\Control\\ProductOptions",
  274. &hKey
  275. );
  276. if (Rslt != ERROR_SUCCESS)
  277. goto exit;
  278. Rslt = RegQueryValueExA( hKey, "ProductSuite", NULL, &Type, NULL, &Size );
  279. if (Rslt != ERROR_SUCCESS || !Size)
  280. goto exit;
  281. ProductSuite = (LPSTR) LocalAlloc( LPTR, Size );
  282. if (!ProductSuite)
  283. goto exit;
  284. Rslt = RegQueryValueExA( hKey, "ProductSuite", NULL, &Type,
  285. (LPBYTE) ProductSuite, &Size );
  286. if (Rslt != ERROR_SUCCESS || Type != REG_MULTI_SZ)
  287. goto exit;
  288. p = ProductSuite;
  289. while (*p)
  290. {
  291. if (lstrcmpA( p, SuiteName ) == 0)
  292. {
  293. rVal = TRUE;
  294. break;
  295. }
  296. p += (lstrlenA( p ) + 1);
  297. }
  298. exit:
  299. if (ProductSuite)
  300. LocalFree( ProductSuite );
  301. if (hKey)
  302. RegCloseKey( hKey );
  303. return rVal;
  304. }
  305. BOOL IsTerminalServicesEnabled( VOID )
  306. {
  307. BOOL bResult = FALSE;
  308. DWORD dwVersion;
  309. OSVERSIONINFOEXA osVersionInfo;
  310. DWORDLONG dwlConditionMask = 0;
  311. HMODULE hmodK32 = NULL;
  312. typedef ULONGLONG (*PFnVerSetConditionMask) ( ULONGLONG, ULONG, UCHAR );
  313. typedef BOOL (*PFnVerifyVersionInfoA) (POSVERSIONINFOEXA, DWORD, DWORDLONG);
  314. PFnVerSetConditionMask pfnVerSetConditionMask;
  315. PFnVerifyVersionInfoA pfnVerifyVersionInfoA;
  316. dwVersion = GetVersion();
  317. /* are we running NT ? */
  318. if (!(dwVersion & 0x80000000))
  319. {
  320. // Is it NT 50 or greater ?
  321. if (LOBYTE(LOWORD(dwVersion)) > 4)
  322. {
  323. /* In NT5 we need to use the Product Suite APIs
  324. Don't static link because it won't load on non-NT5 systems */
  325. hmodK32 = GetModuleHandleA( "KERNEL32.DLL" );
  326. if (hmodK32)
  327. {
  328. pfnVerSetConditionMask = (PFnVerSetConditionMask )GetProcAddress( hmodK32, "VerSetConditionMask");
  329. if (pfnVerSetConditionMask)
  330. {
  331. /* get the condition mask. */
  332. dwlConditionMask = (*pfnVerSetConditionMask)(dwlConditionMask, VER_SUITENAME, VER_AND);
  333. pfnVerifyVersionInfoA = (PFnVerifyVersionInfoA)GetProcAddress( hmodK32, "VerifyVersionInfoA") ;
  334. if (pfnVerifyVersionInfoA != NULL)
  335. {
  336. ZeroMemory(&osVersionInfo, sizeof(osVersionInfo));
  337. osVersionInfo.dwOSVersionInfoSize = sizeof(osVersionInfo);
  338. osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL;
  339. bResult = (*pfnVerifyVersionInfoA)(
  340. &osVersionInfo,
  341. VER_SUITENAME,
  342. dwlConditionMask);
  343. }
  344. }
  345. }
  346. }
  347. else
  348. {
  349. /* This is NT 40 */
  350. bResult = ValidateProductSuite( "Terminal Server" );
  351. }
  352. }
  353. return bResult;
  354. }
  355. /*--------------------------------------------------------------------------------------------------------
  356. * DWORD IsStringInMultiString(HKEY hkey, LPCTSTR szkey, LPCTSTR szvalue, LPCTSTR szCheckForString, BOOL *pbFound)
  357. * checks if parameter string exists in given multistring.
  358. * returns error code.
  359. * -------------------------------------------------------------------------------------------------------*/
  360. DWORD IsStringInMultiString(HKEY hkey, LPCTSTR szkey, LPCTSTR szvalue, LPCTSTR szCheckForString, BOOL *pbFound)
  361. {
  362. ASSERT(szkey && *szkey);
  363. ASSERT(szvalue && *szvalue);
  364. ASSERT(szCheckForString&& *szCheckForString);
  365. ASSERT(*szkey != '\\');
  366. ASSERT(pbFound);
  367. // not yet found.
  368. *pbFound = FALSE;
  369. CRegistry reg;
  370. DWORD dwError = reg.OpenKey(hkey, szkey, KEY_READ); // open up the required key.
  371. if (dwError == NO_ERROR)
  372. {
  373. LPTSTR szSuiteValue;
  374. DWORD dwSize;
  375. dwError = reg.ReadRegMultiString(szvalue, &szSuiteValue, &dwSize);
  376. if (dwError == NO_ERROR)
  377. {
  378. LPCTSTR pTemp = szSuiteValue;
  379. while(_tcslen(pTemp) > 0 )
  380. {
  381. if (_tcscmp(pTemp, szCheckForString) == 0)
  382. {
  383. *pbFound = TRUE;
  384. break;
  385. }
  386. pTemp += _tcslen(pTemp) + 1; // point to the next string within the multistring.
  387. if ( DWORD(pTemp - szSuiteValue) > (dwSize / sizeof(TCHAR)))
  388. break; // temporary pointer passes the size of the szSuiteValue something is wrong with szSuiteValue.
  389. }
  390. }
  391. }
  392. return dwError;
  393. }
  394. BOOL DoesHydraKeysExists()
  395. {
  396. BOOL bStringExists = FALSE;
  397. DWORD dw = IsStringInMultiString(
  398. HKEY_LOCAL_MACHINE,
  399. _T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),
  400. _T("ProductSuite"),
  401. _T("Terminal Server"),
  402. &bStringExists);
  403. return (dw == ERROR_SUCCESS) && bStringExists;
  404. }
  405. TCHAR *IsItAppServer ()
  406. {
  407. return ((GetOSVersionInfo()->wSuiteMask & VER_SUITE_TERMINAL) &&
  408. !(GetOSVersionInfo()->wSuiteMask & VER_SUITE_SINGLEUSERTS)) ? _T("Yes") : _T("No");
  409. }
  410. BOOL IsItServer ()
  411. {
  412. return GetOSVersionInfo()->wProductType != VER_NT_WORKSTATION;
  413. }
  414. TCHAR *GetProductType ()
  415. {
  416. BYTE wProductType = GetOSVersionInfo()->wProductType;
  417. _tcscpy(ReturnBuffer(), _T(""));
  418. if (wProductType == VER_NT_WORKSTATION)
  419. {
  420. _tcscat(ReturnBuffer(), _T("VER_NT_WORKSTATION "));
  421. }
  422. if (wProductType == VER_NT_DOMAIN_CONTROLLER)
  423. {
  424. _tcscat(ReturnBuffer(), _T("VER_NT_DOMAIN_CONTROLLER"));
  425. }
  426. if (wProductType == VER_NT_SERVER)
  427. {
  428. _tcscat(ReturnBuffer(), _T("VER_NT_SERVER"));
  429. }
  430. return ReturnBuffer();
  431. }
  432. TCHAR *GetProductSuite ()
  433. {
  434. WORD wProductSuite = GetOSVersionInfo()->wSuiteMask;
  435. _tcscpy(ReturnBuffer(), _T(""));
  436. if (wProductSuite & VER_SERVER_NT)
  437. {
  438. _tcscat(ReturnBuffer(), _T("VER_SERVER_NT "));
  439. }
  440. if (wProductSuite & VER_WORKSTATION_NT)
  441. {
  442. _tcscat(ReturnBuffer(), _T("VER_WORKSTATION_NT "));
  443. }
  444. if (wProductSuite & VER_SUITE_SMALLBUSINESS)
  445. {
  446. _tcscat(ReturnBuffer(), _T("VER_SUITE_SMALLBUSINESS "));
  447. }
  448. if (wProductSuite & VER_SUITE_ENTERPRISE)
  449. {
  450. _tcscat(ReturnBuffer(), _T("VER_SUITE_ENTERPRISE "));
  451. }
  452. if (wProductSuite & VER_SUITE_BACKOFFICE)
  453. {
  454. _tcscat(ReturnBuffer(), _T("VER_SUITE_BACKOFFICE "));
  455. }
  456. if (wProductSuite & VER_SUITE_COMMUNICATIONS)
  457. {
  458. _tcscat(ReturnBuffer(), _T("VER_SUITE_COMMUNICATIONS "));
  459. }
  460. if (wProductSuite & VER_SUITE_TERMINAL)
  461. {
  462. _tcscat(ReturnBuffer(), _T("VER_SUITE_TERMINAL "));
  463. }
  464. if (wProductSuite & VER_SUITE_SMALLBUSINESS_RESTRICTED)
  465. {
  466. _tcscat(ReturnBuffer(), _T("VER_SUITE_SMALLBUSINESS_RESTRICTED "));
  467. }
  468. if (wProductSuite & VER_SUITE_EMBEDDEDNT)
  469. {
  470. _tcscat(ReturnBuffer(), _T("VER_SUITE_EMBEDDEDNT "));
  471. }
  472. if (wProductSuite & VER_SUITE_DATACENTER)
  473. {
  474. _tcscat(ReturnBuffer(), _T("VER_SUITE_DATACENTER "));
  475. }
  476. if (wProductSuite & VER_SUITE_SINGLEUSERTS)
  477. {
  478. _tcscat(ReturnBuffer(), _T("VER_SUITE_SINGLEUSERTS "));
  479. }
  480. if (wProductSuite & VER_SUITE_PERSONAL)
  481. {
  482. _tcscat(ReturnBuffer(), _T("VER_SUITE_PERSONAL "));
  483. }
  484. return ReturnBuffer();
  485. }
  486. TCHAR *IsServer ()
  487. {
  488. return IsItServer() ? _T("Its a Server") : _T("Its a WorkStation");
  489. }
  490. BOOL IsKernelTSEnable ()
  491. {
  492. return IsTerminalServicesEnabled();
  493. }
  494. BOOL TSEnabled ()
  495. {
  496. CRegistry reg;
  497. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ))
  498. {
  499. DWORD dwTSEnabled = 0;
  500. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("TSEnabled"), &dwTSEnabled))
  501. {
  502. return dwTSEnabled == 1;
  503. }
  504. }
  505. return FALSE;
  506. }
  507. BOOL DoesProductSuiteContainTS ()
  508. {
  509. return DoesHydraKeysExists ();
  510. }
  511. BOOL IsTerminalServerRegistryOk ()
  512. {
  513. CRegistry reg1;
  514. CRegistry reg2;
  515. CRegistry reg3;
  516. return
  517. (ERROR_SUCCESS == reg1.OpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ)) &&
  518. (ERROR_SUCCESS == reg2.OpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations"), KEY_READ)) &&
  519. (ERROR_SUCCESS == reg3.OpenKey(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Terminal Server"), KEY_READ));
  520. }
  521. TCHAR *GetWinstationList ()
  522. {
  523. using namespace std;
  524. TString szWinstationList;
  525. bool bFoundNonConsoleWinstation = false;
  526. szWinstationList = _T("");
  527. CRegistry reg2;
  528. if (ERROR_SUCCESS == reg2.OpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations"), KEY_READ))
  529. {
  530. LPTSTR szWinstation;
  531. DWORD dwSize;
  532. if (ERROR_SUCCESS == reg2.GetFirstSubKey(&szWinstation, &dwSize))
  533. {
  534. bool bFirst = true;
  535. do
  536. {
  537. if (!bFirst)
  538. {
  539. szWinstationList += _T(", ");
  540. }
  541. bFirst = false;
  542. if (0 != _tcsicmp(szWinstation, _T("Console")))
  543. {
  544. bFoundNonConsoleWinstation = true;
  545. //
  546. // we need to read the listner port for this winstation.
  547. //
  548. CRegistry regSubKey;
  549. if ( ERROR_SUCCESS == regSubKey.OpenKey(reg2, szWinstation, KEY_READ) )
  550. {
  551. DWORD dwPort;
  552. if ( ERROR_SUCCESS != regSubKey.ReadRegDWord(_T("PortNumber"), &dwPort))
  553. {
  554. dwPort = 0;
  555. }
  556. TCHAR szPort[20];
  557. _itot(dwPort, szPort, 10);
  558. szWinstationList += szWinstation; // << _T("(") << dwPort << _T(")");
  559. szWinstationList += _T("(");
  560. szWinstationList += szPort;
  561. szWinstationList += _T(")");
  562. }
  563. }
  564. else
  565. {
  566. szWinstationList += szWinstation;
  567. }
  568. }
  569. while (ERROR_SUCCESS == reg2.GetNextSubKey(&szWinstation, &dwSize));
  570. }
  571. }
  572. if (szWinstationList.length() == 0)
  573. {
  574. szWinstationList = _T("Error, No winstations found.");
  575. }
  576. if (!bFoundNonConsoleWinstation)
  577. {
  578. szMoreInfo << "ERROR, No non Console Winstation not found" << endl;
  579. }
  580. _tcscpy(ReturnBuffer(), szWinstationList.c_str());
  581. return ReturnBuffer();
  582. }
  583. TCHAR *IsTerminalServiceStartBitSet ()
  584. {
  585. CRegistry reg;
  586. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\TermService"), KEY_READ))
  587. {
  588. DWORD dwTermServStartBit = 0;
  589. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("Start"), &dwTermServStartBit))
  590. {
  591. switch (dwTermServStartBit)
  592. {
  593. case 2:
  594. return _T("AutoStart");
  595. break;
  596. case 3:
  597. return _T("Manual Start");
  598. break;
  599. case 4:
  600. return _T("Error, Disabled");
  601. break;
  602. default:
  603. return _T("ERROR:Wrong value for startbit");
  604. }
  605. }
  606. }
  607. return _T("Error, Reading startbig");
  608. }
  609. BOOL IsTermDDStartBitSet ()
  610. {
  611. CRegistry reg;
  612. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\TermDD"), KEY_READ))
  613. {
  614. DWORD dwTermDDStartBit = 0;
  615. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("Start"), &dwTermDDStartBit))
  616. {
  617. return dwTermDDStartBit == 2;
  618. }
  619. }
  620. return FALSE;
  621. }
  622. TCHAR *AreEffectiveConnectionAllowed ()
  623. {
  624. HMODULE hmodRegAPI = LoadLibrary( _T("RegApi.dll") );
  625. if (hmodRegAPI)
  626. {
  627. typedef BOOLEAN (*PFDenyConnectionPolicy) ();
  628. PFDenyConnectionPolicy pfnDenyConnectionPolicy;
  629. pfnDenyConnectionPolicy = (PFDenyConnectionPolicy) GetProcAddress( hmodRegAPI, "RegDenyTSConnectionsPolicy");
  630. if (pfnDenyConnectionPolicy)
  631. {
  632. return (*pfnDenyConnectionPolicy)() ? _T("Not Allowed") : _T("Allowed");
  633. }
  634. else
  635. {
  636. szMoreInfo << "Failed to get proc RegDenyTSConnectionsPolicy" << endl;
  637. return _T("Failed");
  638. }
  639. }
  640. else
  641. {
  642. szMoreInfo << "Failed to Load regapi.dll" << endl;
  643. return _T("Failed");
  644. }
  645. }
  646. TCHAR *AreConnectionsAllowed ()
  647. {
  648. DWORD dwError;
  649. CRegistry oRegTermsrv;
  650. dwError = oRegTermsrv.OpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ);
  651. if (ERROR_SUCCESS == dwError)
  652. {
  653. DWORD dwDenyConnect;
  654. dwError = oRegTermsrv.ReadRegDWord(_T("fDenyTSConnections"), &dwDenyConnect);
  655. if (ERROR_SUCCESS == dwError)
  656. {
  657. return dwDenyConnect ? _T("No, Not allowed") : _T("Yes");
  658. }
  659. }
  660. //
  661. // could not read registry, It means - for 51 connection not allowed. For 50 Connections allowed.
  662. //
  663. return IsIt51TS() ? _T("Error, Value not found") : _T("Yes");
  664. }
  665. BOOL GetTSOCLogFileName(char *strFileName, UINT uiSize)
  666. {
  667. if (!GetSystemWindowsDirectoryA(strFileName, uiSize))
  668. return FALSE;
  669. strcat(strFileName, "\\tsoc.log");
  670. ASSERT(strlen(strFileName) < uiSize);
  671. return TRUE;
  672. }
  673. char *IncompleteMessage = "Error:TSOC Did not get OC_COMPLETE_INSTALLATION.";
  674. BOOL DidTsOCgetCompleteInstallationMessage ()
  675. {
  676. if (!IsTSOClogPresent())
  677. {
  678. szMoreInfo << "tsoc.log does not exist." << endl;
  679. return FALSE;
  680. }
  681. char strTSOCLog[256];
  682. GetTSOCLogFileName(strTSOCLog, 256);
  683. ifstream ifSrc(strTSOCLog);
  684. if(!ifSrc)
  685. {
  686. szMoreInfo << "Failed to open tsoc.log file." << endl;
  687. return FALSE;
  688. }
  689. char tempSrc[256];
  690. while(!ifSrc.eof())
  691. {
  692. ifSrc.getline(tempSrc, 256);
  693. if (strstr(tempSrc, IncompleteMessage))
  694. {
  695. return FALSE;
  696. }
  697. }
  698. return TRUE;
  699. }
  700. BOOL FileExists(char *pszFullNameAndPath)
  701. {
  702. ASSERT(pszFullNameAndPath);
  703. if (pszFullNameAndPath && pszFullNameAndPath[0])
  704. {
  705. HANDLE hFile = CreateFileA(pszFullNameAndPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
  706. NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  707. if (hFile != INVALID_HANDLE_VALUE)
  708. {
  709. CloseHandle(hFile);
  710. return TRUE;
  711. }
  712. }
  713. return FALSE;
  714. }
  715. BOOL IsTSOClogPresent ()
  716. {
  717. char strTSOCLog[256];
  718. GetTSOCLogFileName(strTSOCLog, 256);
  719. return FileExists(strTSOCLog);
  720. }
  721. BOOL DidOCMInstallTSEnable()
  722. {
  723. CRegistry reg;
  724. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\OC Manager\\SubComponents"), KEY_READ))
  725. {
  726. DWORD dwTSEnabled = 0;
  727. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("tsenable"), &dwTSEnabled))
  728. {
  729. return dwTSEnabled == 1;
  730. }
  731. }
  732. return FALSE;
  733. }
  734. TCHAR *IsClusteringInstalled ()
  735. {
  736. DWORD dwClusterState;
  737. if (ERROR_SUCCESS == GetNodeClusterState(NULL, &dwClusterState))
  738. {
  739. if (dwClusterState != ClusterStateNotInstalled)
  740. {
  741. return _T("***Failed. Clustering is installed, this is not compatible with Terminal Server.");
  742. }
  743. }
  744. return _T("Passed");
  745. }
  746. TCHAR *GetTSMode (void)
  747. {
  748. return IsRemoteAdminMode() ? _T("Remote Admin") : _T("Application Server");
  749. }
  750. BOOL IsRemoteAdminMode ()
  751. {
  752. // HKLM ,"SYSTEM\CurrentControlSet\Control\Terminal Server","TSAppCompat",0x00010001,0x0
  753. CRegistry reg;
  754. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ))
  755. {
  756. DWORD dwAppCompat = 1;
  757. if ( ERROR_SUCCESS == reg.ReadRegDWord( _T("TSAppCompat"), &dwAppCompat))
  758. {
  759. return dwAppCompat == 0;
  760. }
  761. else
  762. {
  763. // if the registry TSAppCompat does not exist it means we are in app server mode.
  764. return FALSE;
  765. }
  766. }
  767. else
  768. {
  769. szMoreInfo << "ERROR:SYSTEM\\CurrentControlSet\\Control\\Terminal Server not found!" << endl;
  770. }
  771. // this return is bogus.
  772. return TRUE;
  773. }
  774. BOOL VerifyModeRegistry()
  775. {
  776. return CheckModeRegistry(!IsRemoteAdminMode());
  777. }
  778. BOOL CheckModeRegistry (BOOL bAppCompat)
  779. {
  780. USES_CONVERSION;
  781. BOOL bOk = TRUE;
  782. CRegistry reg;
  783. if (IsItServer())
  784. {
  785. CRegistry reg1;
  786. // check registry value
  787. // for appcompat mode
  788. //HKLM ,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","AppSetup",0x00000000,"UsrLogon.Cmd"
  789. // and for remote admin mode
  790. //HKLM ,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","AppSetup",0x00000000,""
  791. if ( ERROR_SUCCESS == reg1.OpenKey( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), KEY_READ))
  792. {
  793. LPTSTR str;
  794. DWORD dwSize;
  795. DWORD dwError;
  796. if (ERROR_SUCCESS == (dwError = reg1.ReadRegString(_T("AppSetup"), &str, &dwSize)))
  797. {
  798. if (bAppCompat)
  799. {
  800. if (_tcsicmp(str, _T("UsrLogon.Cmd")) != 0)
  801. {
  802. bOk = FALSE;
  803. szMoreInfo << "ERROR: Wrong value (" << T2A(str) << ") for AppSetup, contact makarp/breenh" << endl;
  804. }
  805. }
  806. else
  807. {
  808. if (_tcslen(str) != 0)
  809. {
  810. bOk = FALSE;
  811. szMoreInfo << "ERROR: Wrong value (" << T2A(str) << ") for AppSetup, contact makarp/breenh" << endl;
  812. }
  813. }
  814. }
  815. else
  816. {
  817. szMoreInfo << "ERROR reading appsetup registry (" << dwError << ")" << endl;
  818. bOk = FALSE;
  819. }
  820. }
  821. else
  822. {
  823. szMoreInfo << "ERROR:reading SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon" << endl;
  824. bOk = FALSE;
  825. }
  826. }
  827. // check registry value
  828. // for appcompat mode
  829. //HKLM ,"SYSTEM\CurrentControlSet\Control\Terminal Server","IdleWinStationPoolCount",0x00010001,0x2
  830. // and for remote admin mode
  831. //HKLM ,"SYSTEM\CurrentControlSet\Control\Terminal Server","IdleWinStationPoolCount",0x00010001,0x0
  832. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server"), KEY_READ))
  833. {
  834. DWORD dwIdleWinstations;
  835. if (ERROR_SUCCESS == reg.ReadRegDWord(_T("IdleWinStationPoolCount"), &dwIdleWinstations))
  836. {
  837. if (bAppCompat)
  838. {
  839. if (0x2 != dwIdleWinstations)
  840. {
  841. bOk = FALSE;
  842. szMoreInfo << "ERROR: Wrong IdleWinStationPoolCount (" << dwIdleWinstations << ")" << endl;
  843. }
  844. }
  845. else
  846. {
  847. if (0 != dwIdleWinstations)
  848. {
  849. bOk = FALSE;
  850. szMoreInfo << "ERROR: Wrong IdleWinStationPoolCount (" << dwIdleWinstations << ")" << endl;
  851. }
  852. }
  853. }
  854. else
  855. {
  856. bOk = FALSE;
  857. szMoreInfo << "ERROR:Reading IdleWinStationPoolCount registry" << endl;
  858. }
  859. }
  860. else
  861. {
  862. bOk = FALSE;
  863. szMoreInfo << "SYSTEM\\CurrentControlSet\\Control\\Terminal Server" << endl;
  864. }
  865. return bOk;
  866. }
  867. TCHAR * TermSrvCommandLine ()
  868. {
  869. CRegistry reg;
  870. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\TermService"), KEY_READ))
  871. {
  872. TCHAR *Imagepath;
  873. DWORD dwSize;
  874. if ( ERROR_SUCCESS == reg.ReadRegString(_T("ImagePath"), &Imagepath, &dwSize))
  875. {
  876. _tcscpy(ReturnBuffer(), Imagepath);
  877. }
  878. else
  879. {
  880. _tcscpy(ReturnBuffer(), _T("failed to read value"));
  881. }
  882. }
  883. else
  884. {
  885. _tcscpy(ReturnBuffer(), _T("failed to open key"));
  886. }
  887. return ReturnBuffer();
  888. // termsrv executable has to have svchost.exe
  889. }
  890. BOOL IsTerminalServiceRunning ()
  891. {
  892. BOOL bReturn = FALSE;
  893. SC_HANDLE hServiceController = OpenSCManager(NULL, NULL, GENERIC_READ);
  894. if (hServiceController)
  895. {
  896. SC_HANDLE hTermServ = OpenService(hServiceController, _T("TermService"), SERVICE_QUERY_STATUS);
  897. if (hTermServ)
  898. {
  899. SERVICE_STATUS tTermServStatus;
  900. if (QueryServiceStatus(hTermServ, &tTermServStatus))
  901. {
  902. bReturn = (tTermServStatus.dwCurrentState == SERVICE_RUNNING);
  903. }
  904. else
  905. {
  906. szMoreInfo << "Failed to get service status, Error = " << GetLastError() << endl;
  907. }
  908. VERIFY(CloseServiceHandle(hTermServ));
  909. }
  910. else
  911. {
  912. szMoreInfo << "Failed to open TermServ service, Error = " << GetLastError() << endl;
  913. }
  914. VERIFY(CloseServiceHandle(hServiceController));
  915. }
  916. else
  917. {
  918. szMoreInfo << "Failed to Open Service Controller, Error = " << GetLastError() << endl;
  919. }
  920. return bReturn;
  921. }
  922. BOOL CheckVideoKeys ()
  923. {
  924. // HKLM ,"SYSTEM\CurrentControlSet\Control\Terminal Server\VIDEO\rdpdd","VgaCompatible",0x00000000,"\Device\Video0"
  925. // HKLM ,"SYSTEM\CurrentControlSet\Control\Terminal Server\VIDEO\rdpdd","\Device\Video0",0x00000000,"\REGISTRY\Machine\System\ControlSet001\Services\RDPDD\Device0"
  926. CRegistry reg;
  927. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\VIDEO\\rdpdd"), KEY_READ))
  928. {
  929. LPTSTR str = 0;
  930. DWORD dwSize = 0;
  931. if (ERROR_SUCCESS == reg.ReadRegString(_T("VgaCompatible"), &str, &dwSize))
  932. {
  933. if (0 == _tcsicmp(str, _T("\\Device\\Video0")))
  934. {
  935. if (ERROR_SUCCESS == reg.ReadRegString(_T("\\Device\\Video0"), &str, &dwSize))
  936. {
  937. if ((0 == _tcsicmp(str, _T("\\REGISTRY\\Machine\\System\\ControlSet001\\Services\\RDPDD\\Device0"))) ||
  938. (0 == _tcsicmp(str, _T("\\REGISTRY\\Machine\\System\\CurrentControlSet\\Services\\RDPDD\\Device0"))))
  939. {
  940. return TRUE;
  941. }
  942. else
  943. {
  944. }
  945. }
  946. else
  947. {
  948. }
  949. }
  950. else
  951. {
  952. }
  953. }
  954. else
  955. {
  956. }
  957. }
  958. else
  959. {
  960. }
  961. return FALSE;
  962. }
  963. TCHAR szCompName[256];
  964. TCHAR *GetCompName ()
  965. {
  966. DWORD dwCompName = 256;
  967. if (GetComputerName(szCompName, &dwCompName))
  968. {
  969. return szCompName;
  970. }
  971. return NULL;
  972. }
  973. TCHAR szDomNameWorkgroup[] = _T("<Workgroup>");
  974. TCHAR szDomNameUnknown[] = _T("<Unknown>");
  975. TCHAR *GetDomName ()
  976. {
  977. DSROLE_PRIMARY_DOMAIN_INFO_BASIC *pDomainInfo = NULL;
  978. DWORD dwErr;
  979. //
  980. // Check if we're in a workgroup
  981. //
  982. dwErr = DsRoleGetPrimaryDomainInformation(NULL,
  983. DsRolePrimaryDomainInfoBasic,
  984. (PBYTE *) &pDomainInfo);
  985. if (ERROR_SUCCESS != dwErr)
  986. return szDomNameUnknown;
  987. switch (pDomainInfo->MachineRole)
  988. {
  989. case DsRole_RoleStandaloneWorkstation:
  990. case DsRole_RoleStandaloneServer:
  991. return szDomNameWorkgroup;
  992. break; // just in case
  993. }
  994. if (pDomainInfo->DomainNameFlat)
  995. return pDomainInfo->DomainNameFlat;
  996. else if (pDomainInfo->DomainNameDns)
  997. return pDomainInfo->DomainNameDns;
  998. else
  999. return szDomNameUnknown;
  1000. }
  1001. TCHAR szSiteNameWorkgroup[] = _T("<Workgroup>");
  1002. TCHAR szSiteNameUnknown[] = _T("<Unknown>");
  1003. TCHAR *GetSiteName ()
  1004. {
  1005. LPTSTR szSiteName = NULL;
  1006. DWORD dwErr;
  1007. DSROLE_PRIMARY_DOMAIN_INFO_BASIC *pDomainInfo = NULL;
  1008. //
  1009. // Check if we're in a workgroup
  1010. //
  1011. dwErr = DsRoleGetPrimaryDomainInformation(NULL,
  1012. DsRolePrimaryDomainInfoBasic,
  1013. (PBYTE *) &pDomainInfo);
  1014. if (ERROR_SUCCESS != dwErr)
  1015. return szSiteNameUnknown;
  1016. switch (pDomainInfo->MachineRole)
  1017. {
  1018. case DsRole_RoleStandaloneWorkstation:
  1019. case DsRole_RoleStandaloneServer:
  1020. return szSiteNameWorkgroup;
  1021. break; // just in case
  1022. }
  1023. dwErr = DsGetSiteName(NULL,&szSiteName);
  1024. if (NO_ERROR != dwErr)
  1025. {
  1026. return szSiteNameUnknown;
  1027. }
  1028. return szSiteName;
  1029. }
  1030. WCHAR wszIPAddress[128] = L"<error>";
  1031. TCHAR *GetIPAddress ()
  1032. {
  1033. //get host address
  1034. WORD wVersionRequested = MAKEWORD( 1, 1 );
  1035. WSADATA wsaData;
  1036. if (0 == WSAStartup(wVersionRequested,&wsaData))
  1037. {
  1038. char szHostName[256];
  1039. if (0 == gethostname ( szHostName , 256 ))
  1040. {
  1041. hostent *h;
  1042. if (NULL != (h=gethostbyname ( szHostName )))
  1043. {
  1044. in_addr *inaddr=(struct in_addr *)*h->h_addr_list;
  1045. MultiByteToWideChar(CP_ACP,0,inet_ntoa(*inaddr),-1,wszIPAddress,128);
  1046. }
  1047. }
  1048. }
  1049. return wszIPAddress;
  1050. }
  1051. TCHAR *IsRDPNPinNetProviders ()
  1052. {
  1053. TCHAR NEWORK_PROVIDER_ORDER_KEY[] = _T("SYSTEM\\CurrentControlSet\\Control\\NetworkProvider\\Order");
  1054. TCHAR PROVIDER_ORDER_VALUE[] = _T("ProviderOrder");
  1055. TCHAR RDPNP_ENTRY[] = _T("RDPNP");
  1056. BOOL bRdpNpExists = FALSE;
  1057. // read network privider key.
  1058. CRegistry regNetOrder;
  1059. LPTSTR szOldValue;
  1060. DWORD dwSize;
  1061. if ((ERROR_SUCCESS == regNetOrder.OpenKey(HKEY_LOCAL_MACHINE, NEWORK_PROVIDER_ORDER_KEY, KEY_READ)) &&
  1062. (ERROR_SUCCESS == regNetOrder.ReadRegString(PROVIDER_ORDER_VALUE, &szOldValue, &dwSize)))
  1063. {
  1064. bRdpNpExists = (_tcsstr(szOldValue, RDPNP_ENTRY) != NULL);
  1065. }
  1066. if (TSEnabled () == bRdpNpExists)
  1067. {
  1068. return (_T("Passed"));
  1069. }
  1070. else
  1071. {
  1072. if (bRdpNpExists)
  1073. {
  1074. return _T("Error: RDPNP, exists in ProviderOrder, but TS is disabled!");
  1075. }
  1076. else
  1077. {
  1078. if (IsIt50TS())
  1079. {
  1080. // rdp np is only for 51+ so its ok if its missing for 50.
  1081. return _T("Passed");
  1082. }
  1083. else
  1084. {
  1085. return _T("ERROR, RDPNP is missing from ProviderOrder");
  1086. }
  1087. }
  1088. }
  1089. }
  1090. TCHAR *IsMultiConnectionAllowed ()
  1091. {
  1092. // SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","AllowMultipleTSSessions
  1093. CRegistry regWL;
  1094. DWORD dwAllowMultipal;
  1095. if ((ERROR_SUCCESS == regWL.OpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), KEY_READ)) &&
  1096. (ERROR_SUCCESS == regWL.ReadRegDWord(_T("AllowMultipleTSSessions"), &dwAllowMultipal)))
  1097. {
  1098. return dwAllowMultipal ? _T("Yes") : _T("No");
  1099. }
  1100. if (IsIt50TS() || IsItServer())
  1101. {
  1102. return _T("Yes");
  1103. }
  1104. else
  1105. {
  1106. return _T("ERROR, registry missing");
  1107. }
  1108. }
  1109. TCHAR *LogonType ()
  1110. {
  1111. if (0 == _tcsicmp(GetDomName(), szDomNameWorkgroup))
  1112. {
  1113. CRegistry regWL;
  1114. DWORD dwLogonType;
  1115. if ((ERROR_SUCCESS == regWL.OpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), KEY_READ)) &&
  1116. (ERROR_SUCCESS == regWL.ReadRegDWord(_T("LogonType"), &dwLogonType)))
  1117. {
  1118. return dwLogonType == 0 ? _T("Classic Gina") : _T("New Fancy");
  1119. }
  1120. if (IsIt50TS())
  1121. {
  1122. return _T("Classic");
  1123. }
  1124. else
  1125. {
  1126. return _T("ERROR, registry missing");
  1127. }
  1128. }
  1129. else
  1130. {
  1131. return _T("Classic Gina");
  1132. }
  1133. }
  1134. BOOL IsTermSrvInSystemContext ()
  1135. {
  1136. USES_CONVERSION;
  1137. CRegistry reg;
  1138. if ( ERROR_SUCCESS == reg.OpenKey( HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\TermService"), KEY_READ))
  1139. {
  1140. TCHAR *szObjectName;
  1141. DWORD dwSize;
  1142. if ( ERROR_SUCCESS == reg.ReadRegString( _T("ObjectName"), &szObjectName, &dwSize))
  1143. {
  1144. if (0 == _tcsicmp(szObjectName, _T("LocalSystem")))
  1145. {
  1146. return TRUE;
  1147. }
  1148. else
  1149. {
  1150. szMoreInfo << "ERROR:Termsrv is set to run using (" << T2A(szObjectName) << ") context." << endl;
  1151. }
  1152. }
  1153. else
  1154. {
  1155. szMoreInfo << "failed to read Objectname" << endl;
  1156. }
  1157. }
  1158. else
  1159. {
  1160. szMoreInfo << "failed to open termsrv registry" << endl;
  1161. }
  1162. return FALSE;
  1163. }
  1164. BOOL DontRun ()
  1165. {
  1166. szMoreInfo << "test not run because its not required." << endl;
  1167. return FALSE;
  1168. }
  1169. BOOL DoRun ()
  1170. {
  1171. szMoreInfo << "this test must be run." << endl;
  1172. return TRUE;
  1173. }
  1174. TCHAR *SystemDirectory()
  1175. {
  1176. TCHAR sysdir[MAX_PATH];
  1177. sysdir[0] = '\0';
  1178. if (GetSystemDirectory(sysdir, MAX_PATH) >= MAX_PATH) {
  1179. sysdir[MAX_PATH -1] = '\0';
  1180. }
  1181. _tcscpy(ReturnBuffer(), sysdir);
  1182. return ReturnBuffer();
  1183. }
  1184. BOOL IsListenerSessionPresent()
  1185. {
  1186. PWTS_SESSION_INFO pWtsSessionInfo;
  1187. DWORD dwCount;
  1188. bool bReturn = false;
  1189. if (WTSEnumerateSessions(
  1190. WTS_CURRENT_SERVER_HANDLE,
  1191. 0,
  1192. 1,
  1193. &pWtsSessionInfo,
  1194. &dwCount
  1195. ))
  1196. {
  1197. for (DWORD i = 0; i < dwCount; i++)
  1198. {
  1199. if (pWtsSessionInfo[i].State == WTSListen)
  1200. {
  1201. bReturn = true;
  1202. break;
  1203. }
  1204. }
  1205. WTSFreeMemory(pWtsSessionInfo);
  1206. }
  1207. else
  1208. {
  1209. return FALSE;
  1210. }
  1211. return bReturn;
  1212. }
  1213. BOOL AreRemoteLogonEnabled ()
  1214. {
  1215. CRegistry oRegTermsrv;
  1216. if (ERROR_SUCCESS == oRegTermsrv.OpenKey(
  1217. HKEY_LOCAL_MACHINE,
  1218. _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
  1219. KEY_READ
  1220. ))
  1221. {
  1222. DWORD dwSize = 0;
  1223. LPTSTR szWinstationDisabled = NULL;
  1224. if (ERROR_SUCCESS == oRegTermsrv.ReadRegString(_T("WinStationsDisabled"), &szWinstationDisabled, &dwSize))
  1225. {
  1226. if (_tcscmp(_T("0"), szWinstationDisabled) != 0)
  1227. {
  1228. return FALSE;
  1229. }
  1230. }
  1231. }
  1232. return TRUE;
  1233. }
  1234. #define DOMAIN_LENGTH 17
  1235. #define USERNAME_LENGTH 20
  1236. int
  1237. #if !defined(_MIPS_) && !defined(_ALPHA_) && !defined(_PPC_)
  1238. _cdecl
  1239. #endif
  1240. main( int argc , char ** /* argv */)
  1241. {
  1242. typedef BOOL (PFN_BOOL)(void);
  1243. typedef TCHAR * (PFN_TestSubjective)(void);
  1244. USES_CONVERSION;
  1245. struct TVerificationTest
  1246. {
  1247. char szTestName[256]; // descriptive name of the test
  1248. PFN_BOOL *pfnNeedRunTest; // pointer to function that will be called to decide if the test need run, test is run if NULL.
  1249. PFN_TestSubjective *pfnSubTest; // pointer to function if the test returns TCHAR *
  1250. PFN_BOOL *pfnObjTest; // pointer to function if the test returns BOOL
  1251. }
  1252. theTests[] =
  1253. {
  1254. {"Machine Name...............................", NULL, GetCompName, NULL},
  1255. {"Domain Name................................", NULL, GetDomName, NULL},
  1256. {"Site Name..................................", NULL, GetSiteName, NULL},
  1257. {"IP Address.................................", NULL, GetIPAddress, NULL},
  1258. {"System Dir.................................", NULL, SystemDirectory, NULL},
  1259. {"ProductType................................", NULL, GetProductType, NULL},
  1260. {"ProductSuite...............................", NULL, GetProductSuite, NULL},
  1261. {"TS Version.................................", NULL, GetTSVersion, NULL},
  1262. {"Is this a server machine?..................", NULL, IsServer, NULL},
  1263. {"Is tsoc.log Present?.......................", NULL, NULL, IsTSOClogPresent},
  1264. {"Did TsOC get CompleteInstallationMessage...", NULL, NULL, DidTsOCgetCompleteInstallationMessage},
  1265. {"Does ProductSuite Contain TS?..............", IsItServer, NULL, DoesProductSuiteContainTS},
  1266. {"Did OCM Install TSEnable...................", IsIt50TS, NULL, DidOCMInstallTSEnable},
  1267. {"Is TSEnabled registry alright?.............", NULL, NULL, TSEnabled},
  1268. {"Is Kernel TSEnabled?.......................", IsItServer, NULL, IsKernelTSEnable},
  1269. {"Is Terminal Server Registry Ok?............", NULL, NULL, IsTerminalServerRegistryOk},
  1270. {"GetWinstationList..........................", NULL, GetWinstationList, NULL},
  1271. {"Is TermServ Start Bit Ok?..................", NULL, IsTerminalServiceStartBitSet, NULL},
  1272. {"Is TermServ service running?...............", NULL, NULL, IsTerminalServiceRunning},
  1273. {"Termsrv Service Command....................", NULL, TermSrvCommandLine, NULL},
  1274. {"Is Listner session Present ?...............", IsTerminalServiceRunning, NULL, IsListenerSessionPresent},
  1275. {"Is TermSrv in System Context?..............", NULL, NULL, IsTermSrvInSystemContext},
  1276. {"AreEffectiveConnectionAllowed..............", IsIt51TS, AreEffectiveConnectionAllowed, NULL },
  1277. {"Are Connections Allowed?...................", IsIt51TS, AreConnectionsAllowed, NULL},
  1278. {"Are Remote Logons allowed by winlogon?.....", NULL, NULL, AreRemoteLogonEnabled},
  1279. {"Is RdpDr Installed Properly?...............", NULL, NULL, IsRdpDrInstalledProperly},
  1280. {"Is RdpNP in NetProviders?..................", IsIt51TS, IsRDPNPinNetProviders, NULL},
  1281. {"Are Multipal Connections Allowed...........", IsIt51TS, IsMultiConnectionAllowed, NULL},
  1282. {"Are Video keys setup right?................", NULL, NULL, CheckVideoKeys},
  1283. {"What mode is Terminal Server set in?.......", NULL, GetTSMode, NULL},
  1284. // {"Is mode specific registry ok?..............", NULL, NULL, VerifyModeRegistry},
  1285. {"What is permission Mode set to?............", NULL, GetModePermissions, NULL},
  1286. {"Check termdd signature.....................", NULL, NULL, Check_termdd},
  1287. {"Check tdpipe signature.....................", NULL, NULL, Check_tdpipe},
  1288. {"Check tdtcp signature......................", NULL, NULL, Check_tdtcp},
  1289. {"Check rdpwd signature......................", NULL, NULL, Check_rdpwd},
  1290. {"Check rdpdd signature......................", NULL, NULL, Check_rdpdd},
  1291. {"Check rdpwsx signature.....................", NULL, NULL, Check_rdpwsx},
  1292. {"Is it 56 bit or 128?.......................", NULL, GetCypherStrenthOnRdpwd, NULL},
  1293. {"Is this a Beta System?.....................", NULL, IsBetaSystem, NULL},
  1294. {"Has Licence GracePeriod Expired............", NULL, IsLicenceGracePeriodOk, NULL},
  1295. {"Audio test.................................", IsIt51TS, NULL, IsAudioOk}
  1296. };
  1297. BOOL bEverythingOk = TRUE;
  1298. for (int i=0; i < sizeof(theTests)/sizeof(theTests[0]); i++)
  1299. {
  1300. ASSERT(theTests[i].pfnObjTest || theTests[i].pfnSubTest);
  1301. ASSERT(!(theTests[i].pfnObjTest && theTests[i].pfnSubTest));
  1302. if (theTests[i].pfnNeedRunTest && !(*(theTests[i].pfnNeedRunTest))())
  1303. {
  1304. // we asre asked to skip the test.
  1305. cout << theTests[i].szTestName << "Skipped Test" << endl;
  1306. }
  1307. else
  1308. {
  1309. if (theTests[i].pfnObjTest)
  1310. {
  1311. BOOL bResult = (*(theTests[i].pfnObjTest))();
  1312. cout << theTests[i].szTestName << (bResult ? "Passed" : "Failed") << endl;
  1313. if (!bResult)
  1314. bEverythingOk = FALSE;
  1315. }
  1316. else
  1317. {
  1318. char *szStr = T2A((*(theTests[i].pfnSubTest))());
  1319. if (szStr)
  1320. {
  1321. cout << theTests[i].szTestName << szStr << endl;
  1322. }
  1323. }
  1324. }
  1325. //
  1326. // if previous test had any details to tell us
  1327. //
  1328. if (szMoreInfo.pcount())
  1329. {
  1330. char *pStr = szMoreInfo.str();
  1331. cout << " Details:" << pStr;
  1332. cout << "------------------------------------------------" << endl;
  1333. bEverythingOk = FALSE;
  1334. ZeroMemory(pStr, 512);
  1335. szMoreInfo.seekp(ios::beg);
  1336. }
  1337. }
  1338. cout << endl;
  1339. if (argc == 1 ) // if some argumnent is provided skip these time consuming test.
  1340. {
  1341. cout << "Enumerating Licensing Servers (May take some time)...";
  1342. cout.flush();
  1343. if(!IsRemoteAdminMode())
  1344. {
  1345. if (EnumerateLicenseServers())
  1346. {
  1347. cout << ".....Passed, Found Some!" << endl;
  1348. }
  1349. else
  1350. {
  1351. cout << ".....Failed. No License Server Found." << endl;
  1352. }
  1353. }
  1354. else
  1355. {
  1356. cout << "No License servers applicable in Remote Admin mode...";
  1357. }
  1358. cout << "Extracting Related Events from Event Log...";
  1359. cout.flush();
  1360. if (ExtractAllTSEvents())
  1361. {
  1362. cout << ".....Found Some. See if they give any clue." << endl;
  1363. }
  1364. else
  1365. {
  1366. cout << ".....Found None." << endl;
  1367. }
  1368. }
  1369. cout << endl;
  1370. if (bEverythingOk)
  1371. {
  1372. cout << endl;
  1373. cout << "**************************************************************" << endl;
  1374. cout << "*** Nothing wrong with TS could detected by this utility. ***" << endl;
  1375. cout << "*** If you think something is wrong contact the developer. ***" << endl;
  1376. cout << "**************************************************************" << endl;
  1377. return 0;
  1378. }
  1379. return 1;
  1380. }