DOCUMENT:Q251066 06-APR-2000 [foxpro] TITLE :HOWTO: Determine If a Computer Is a Microsoft Terminal Server PRODUCT :Microsoft FoxPro PROD/VER:WINDOWS:3.0,3.0b,5.0,5.0a,6.0 OPER/SYS: KEYWORDS:kbAPI kbvfp kbvfp300 kbvfp300b kbvfp500 kbvfp500a kbvfp600 kbGrpDSFox kbDSupport kbCode ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0, 5.0a, 6.0 ------------------------------------------------------------------------------- SUMMARY ======= This article shows how to determine if a computer is a Microsoft Windows NT or Windows 2000 Terminal Server. MORE INFORMATION ================ 1. In Visual FoxPro, create a program file using the following code: *Start of Code LOCAL lTerminalServer lTerminalServer = IsTerminalServer() IF (lTerminalServer) THEN =MESSAGEBOX ("This Computer is a Terminal Server") ELSE =MESSAGEBOX("This Computer is not a Terminal Server") ENDIF FUNCTION IsTerminalServer * This function will determine if the machine is a Terminal Server. * It will return .T. if it is and .F. if not. * Constants that are needed for Registry functions #DEFINE HKEY_LOCAL_MACHINE -2147483646 && BITSET(0,31)+2 #DEFINE REG_DWORD 4 && A 32-bit number. * WIN 32 API functions that are used DECLARE Integer RegOpenKey IN Win32API ; Integer nHKey, String @cSubKey, Integer @nResult DECLARE Integer RegQueryValueEx IN Win32API ; Integer nHKey, String lpszValueName, Integer dwReserved,; Integer @lpdwType, String @lpbData, Integer @lpcbData DECLARE Integer RegCloseKey IN Win32API ; Integer nHKey DECLARE GetVersionEx IN win32api STRING @OSVERSIONINFO * Local variables used LOCAL nErrCode && Error Code returned from Registry functions LOCAL nKeyHandle && Handle to Key that is opened in the Registry LOCAL lpdwValueType && Type of Value that we are looking for LOCAL lpbValue && The data stored in the value LOCAL lpcbValueSize && Size of the variable LOCAL lpdwReserved && Reserved Must be 0 LOCAL cKey && Key we need to open LOCAL cValueToGet && Value to get LOCAL lTerminalServer && True if it is a Terminal Server LOCAL nTSEnabled && Numeric value of TSEnabled LOCAL OSVersion && OS Version LOCAL cMajorVersion && Just the Version number i.e. 4 or 5 * Initialize the variables cKey = "System\CurrentControlSet\Control\Terminal Server" cValueToGet = "TSEnabled" nKeyHandle = 0 lpdwReserved = 0 && Must be 0 lpdwValueType = REG_DWORD lpcbValueSize = 4 && DWORD is 4 bytes lTerminalServer = .F. && Assume it isn't a Terminal Server lpbValue = SPACE(4) nErrCode = RegOpenKey(HKEY_LOCAL_MACHINE, cKey, @nKeyHandle) * If the error code isn't 0, then the key doesn't exist or can't be opened. IF (nErrCode # 0) THEN RETURN .F. ENDIF * We need to check and see what version we are running NT 4 and Windows 2000 are different OSVersion = LongToStr(148) + REPLICATE(CHR(0), 144) =GetVersionEx(@OSVersion) nMajorVersion = StrToLong(SUBSTR(OSVersion, 5, 4)) cMajorVersion = ALLTRIM(STR(nMajorVersion)) * If it is NT 4 and we made it this far the machine is a Terminal Server IF (cMajorVersion = "4") THEN * Close the key when done. =RegCloseKey(nKeyHandle) RETURN .T. ENDIF * Get the value of TSEnabled. 1 is a Terminal Server 0 isn't nErrCode=RegQueryValueEx(nKeyHandle, cValueToGet, lpdwReserved, @lpdwValueType, @lpbValue, @lpcbValueSize) * Close the key when done. =RegCloseKey(nKeyHandle) IF (nErrCode # 0) THEN RETURN .F. ELSE nTSEnabled = StrToLong(lpbValue) ENDIF * Check to see if it is a Terminal Server IF (nTSEnabled = 1) THEN RETURN .T. ELSE RETURN .F. ENDIF ENDFUNC FUNCTION StrToLong * This function converts a String to a Long PARAMETERS cLongStr LOCAL nLoopVar, nRetval nRetval = 0 FOR nLoopVar = 0 TO 24 STEP 8 nRetval = nRetval + (ASC(cLongStr) * (2^nLoopVar)) cLongStr = RIGHT(cLongStr, LEN(cLongStr) - 1) NEXT RETURN nRetval FUNCTION LongToStr * This function converts a long to a string PARAMETERS nLongVal LOCAL nLoopVar, strReturn strReturn = "" FOR nLoopVar = 24 TO 0 STEP -8 strReturn = CHR(INT(nLongVal/(2^nLoopVar))) + strReturn nLongVal = MOD(nLongVal, (2^nLoopVar)) NEXT RETURN strReturn *End of Code 2. Run the program created in step 1. The result appears in a message box as: This computer is a Terminal Server. -or- This computer is not a Terminal Server. Additional query words: ====================================================================== Keywords : kbAPI kbvfp kbvfp300 kbvfp300b kbvfp500 kbvfp500a kbvfp600 kbGrpDSFox kbDSupport kbCodeSnippet Technology : kbVFPsearch kbAudDeveloper kbVFP300 kbVFP300b kbVFP500 kbVFP600 kbVFP500a Version : WINDOWS:3.0,3.0b,5.0,5.0a,6.0 Issue type : kbhowto ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2000.