320 Figures 10.1 through 10.6 demonstrate the overall flow of the game from beginning to end. Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Figure 10.1 First, you need to run the Hangman setup script once to establish the game’s new Registry setting. Figure 10.2 The Hangman game begins exactly as it did before, by inviting the user to play a game. Figure 10.3 Now a list of word categories is dynamically generated, allowing the player to select a category of words to play in. Figure 10.4 The flow of the game runs exactly as it did before, by randomly selecting a word from whichever word category the player selected. By the time you’ve finished writing the new Hangman setup script and modifying the orig- inal Hangman game, you’ll have a basic understanding of the Windows Registry and what it means to access and modify its contents. You will also know how to retrieve data stored in external files to use it as input in your VBScripts. Introducing the Windows Registry Since the introduction of Windows 95, the Registry has been the central repository for con- figuration information on all Microsoft operating systems. The Registry is a type of built-in database that acts as a central repository for configuration settings. Windows uses it to store information that affects every component of the computer, including • Windows operating system configuration settings • Software configuration settings • User configuration settings • Windows services configuration settings • Hardware configuration settings • Software device driver configuration settings 321 Chapter 10 • Using the Windows Registry to Configure Script Settings Figure 10.5 When the game ends, the results are displayed and the player is invited to guess a new word. Figure 10.6 Eventually, the game’s closing splash screen is displayed, providing information about the game and its author. 322 Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition As you can see, the Registry is used to store information regarding just about every aspect of the computer and its operation. It only makes sense then, that by making changes to the Reg- istry, you can configure the appearance, behavior, and operation of just about anything that affects the computer. For example, you could directly change the appearance and behavior of the Windows desktop or screen saver by making the appropriate changes to the Registry. The Registry is so critical to the operation of Windows computers that you actually interact with it just about every day, perhaps without ever even realizing it. For example, just about every time you open the Windows Control Panel and make a change using one its utilities or applets, you end up changing a configuration setting stored in the Registry. In the case of the Control Panel applets, Microsoft has just made things easy for you by creating a col- lection of specialized graphical interfaces, each of which is designed to help you change the way the computer is configured. Alternatively, you can use the Windows Regedit Registry editor utility that comes with Windows to view and make changes to the Registry. Because the Registry is a very reliable repository for storing and retrieving information, many application developers take advantage of it by storing their appli- cation’s settings there. In a similar fashion, you can migrate settings from your VBScripts into the Registry. You can also create VBScripts that can manipulate Registry contents to affect virtually every aspect of your computer’s operation. How Is the Registry Organized? The Registry is organized as a collection of five root or parent keys, which are defined in Table 10.1. All the data in the Registry is stored in a tree-like fashion under one of these keys. If you are still working with Windows 98 or Me, you’ll see that that operating system supports a sixth root key name HKEY_DYN_DATA. This key manages con- figuration settings that reference plug and play information. Although the Registry is logically organized into five root keys, physically it consists of many files. On computers running Windows 2000 or Windows XP, files belonging to the Registry can be found in %systemroot%\system32\config. These files include • DEFAULT • SYSTEM • SECURITY HINT Definition The Windows Registry is a built-in database that the operating system uses to store configuration infor- mation about itself, as well as the computer’s software, hardware, and applications. • SAM • SOFTWARE • Userdiff %systemroot% is an environment variable created and maintained by the operating system. This variable identifies the location of the folder where Windows stores system files and folders. By default, this is C:\Windows on Windows 2000 and XP. Information managed by the Windows Registry also consists of data stored about each user of the computer. This data is stored in user profiles, which are located in the Documents and Settings folder belonging to each user of the computer. Even though the Registry has five root keys, as a VBScript programmer, chances are you’ll only need to work with three of them. To help make things easier on you, Microsoft has created a short name reference for each of these three keys. You can see these shortcut names listed in the second column of Table 10.1. You can, however, still interact with the remaining two keys by specifying their full names ( HKEY_CURRENT_CONFIG and HKEY_USERS). Understanding How Data Is Stored in the Registry Data stored in the Windows Registry is organized into a hierarchy. This hierarchy consists of keys and values. A key is a container that holds values or other keys. Values are used to store actual data. All data stored in the Windows Registry has the following format: Key : key_type : value TRICK 323 Chapter 10 • Using the Windows Registry to Configure Script Settings Key Short Name Description HKEY_CLASSES_ROOT HKCR Stores information about Windows file associations HKEY_CURRENT_USER HKCU Stores information about the currently logged-on user HKEY_LOCAL_MACHINE HKLM Stores global computer settings HKEY_USERS - Stores information about all users of the computer HKEY_CURRENT_CONFIG - Stores information regarding the computer’s current configuration TABLE 10.1 R EGISTRY ROOT K EYS Key specifies the name of a Registry key. For example, to reference the Control Panel subkey, you would specify HKCU\Control Panel\. To reference the Desktop subkey, which is located under the Control Panel subkey, you would specify HKCU\Control Panel\Desktop\. Note that in both examples, the name of the last subkey is fol- lowed by the \ character. This character identifies that what is being referenced is a key and not a value. Value specifies the container used to store actual data. To reference a value, instead of the key that stores it, you must add the name of the value without the clos- ing \ character. For example, to reference the Screen- SaveActive value stored in the Desktop subkey, you would specify HKCU\Control Panel\Desktop\ScreenSaveActive. Key_type identifies the type of data that has been stored. The Registry is capable of storing many types of data, as shown in Table 10.2. Every value within the Registry falls into one of two types, either named or unnamed. The most common type of value is named. Named values have been assigned an explicit name. This allows you to retrieve the data stored in the value by specifying its name. Unnamed values, as the name implies, do not have a name assigned to them. One unnamed value is stored under 324 Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Definition A Registry key is a container that stores other Registry keys and val- ues. You can think of a key as being akin to a folder in the Windows file system. Data Type Description REG_BINARY Stores a binary value REG_DWORD Stores a hexadecimal DWORD value REG_EXPAND_SZ Stores an expandable string REG_MULTI_SZ Stores multiple strings REG_SZ Stores a string TABLE 10.2 D ATA T YPES S UPPORTED BY THE W INDOWS REGISTRY Definition Within the context of the Windows Registry, a value repre- sents the name of an element to which data is assigned. Therefore, a Registry value acts in many ways like a file, which is a container for storing data in a Windows file system. every key. This value represents the key’s default value. In other words, it’s the value that would be retrieved if you did not specify a specific value by name. Windows graphically identifies unnamed values by displaying a label of Default as demonstrated in Figure 10.7. 325 Chapter 10 • Using the Windows Registry to Configure Script Settings Figure 10.7 Unnamed values are assigned a label of Default. Unnamed value Named values Figure 10.8 Examining the Windows Registry using the Regedit utility. 326 Accessing Registry Keys and Values You can manually view the contents of the Windows Registry using the Regedit utility sup- plied with every version of Windows. In addition, if you’re using Windows NT, 2000, or XP, you can also use the Regedt32 utility, which looks and works like the Regedit utility. For example, Figure 10.8 provides a high-level view of the Registry using the Regedit utility. As you can see, the five root keys are visible, and one of the root keys has been partially expanded to reveals its tree-like structure. One of the easiest ways to mess things up on a computer is to modify the Windows Registry without knowing what you’re doing. The Windows Registry stores extremely critical system information. Incorrectly configuring keys and values stored in the Registry can have a disastrous effect on the computer, and could potentially disable Windows from starting. Unless you’re absolutely sure how a change will affect the Registry, don’t make the change. Creating a Key and Value to Store Script Settings The WSH WshShell object supplies three methods that provide VBScript with the capability to access, modify, and delete Registry keys and values. These methods are demonstrated in the sections that follow. • RegWrite(). Provides the ability to create and modify a Registry key or value. • RegRead(). Provides the ability to retrieve a Registry key or value. • RegDelete(). Provides the ability to delete a Registry key or value. Creating or Modifying Registry Keys and Values The first step in creating a new Registry key and value is to instantiate the WshShell object within your VBScript. Then, using the WshShell object’s RegWrite() method, all you have to do is provide the name of a new key or value and its location within one of the five Registry root keys. For example, the following statements create a new key called GameKey under the HKEY_Current_User root key, and then create a value called HomeFolder and assign it a string of “C:\VBScript\Games”. Set objWshShell = WScript.CreateObject(“WScript.Shell”) objWshShell.RegWrite “HKCU\GameKey\HomeFolder”, “C:\VBScript\Games” You can later modify the Registry value by simply changing its assignment like this: Set objWshShell = WScript.CreateObject(“WScript.Shell”) objWshShell.RegWrite “HKCU\GameKey\HomeFolder”, “C:\MyGames\VBScript” TRAP Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition A single Registry key can be used to store any number of values. For example, the following statements establish a second value named FileType under the GameKey key and assign it a string of “.txt”: Set objWshShell = WScript.CreateObject(“WScript.Shell”) objWshShell.RegWrite “HKCU\GameKey\FileType”, “.txt” Accessing Information Stored in the Registry After a Registry key and one or more values have been established, you can read them using the WshShell object’s RegRead() method. For example, the following statements read and then display the value stored in the previous example: Set objWshObject = WScript.CreateObject(“WScript.Shell”) strResults = objWshObject.RegRead(“HKCU\GameKey\FileType”) MsgBox strResults Deleting Keys and Values Now let’s delete one of the two Registry values that we’ve just created using the WshShell object’s RegDelete() method, as follows: Set objWshObject = WScript.CreateObject(“WScript.Shell”) objWshObject.RegDelete “HKCU\GameKey\FileType” In similar fashion, you can delete the GameKey key, thus deleting all the values that it stores, like this: Set objWshObject = WScript.CreateObject(“WScript.Shell”) objWshObject.RegDelete “HKCU\GameKey\” Take note of the \ character that follows the word GameKey in the previous statement. This character tells the RegDelete() method that the specified element is a Registry key and not a value. Retrieving System Information Stored in the Registry Now that you know the basics of reading, writing, modifying, and deleting Registry keys and values, look at the following example. In this example, the ProcessorInfo.vbs script shows how to retrieve information about the processor (that is, the CPU) of the computer on which the script is run. 327 Chapter 10 • Using the Windows Registry to Configure Script Settings 328 ‘************************************************************************* ‘Script Name: ProcessorInfo.vbs ‘Author: Jerry Ford ‘Created: 12/13/02 ‘Description: This script collects CPU information about the computer that ‘it is running on. ‘************************************************************************* ‘Initialization Section Option Explicit Dim objWshShl, intResponse, strCpuSpeed, strCpuVendor, strCpuID ‘Set up an instance of the WshShell object Set objWshShl = WScript.CreateObject(“WScript.Shell”) ‘Main Processing Section ‘Prompt for permission to continue intResponse = MsgBox(“This VBScript gathers information about your “ & _ “processor from the Windows registry.” & vbCrLf & vbCrLf & _ “Do you wish to continue?”, 4) ‘Call the function that collects CPU information If intResponse = 6 Then GetProcessorInfo() End If WScript.Quit() ‘Procedure Section Function GetProcessorInfo() ‘Get the processor speed strCpuSpeed = objWshShl.RegRead _ (“HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~MHz”) Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition ‘Get the manufacturer name strCpuVendor = objWshShl.RegRead _ (“HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\VendorIdentifier”) ‘Get processor ID information strCpuID = objWshShl.RegRead _ (“HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\Identifier”) MsgBox “Speed: “ & strCpuSpeed & vbCrLf & “Manufacturer: “ & _ strCpuVendor & vbCrLf & “ID: “ & strCpuID End Function The script’s Initialization Section defines its variables and instantiates the WshShell object. The Main Processing Section prompts the user for confirmation before continuing, and then calls the GetProcessorInfo() function before executing the WScript.Quit() method, thus ter- minating the script’s execution. The GetProcessorInfo() function performs three Registry read operations using the WshShell object’s RegRead() method. Each read operation retrieves a different piece of information about the computer’s processor. The function then uses the VBScript MsgBox() function to display a text string of the information collected about the computer’s processor. For additional examples of how to use VBScript to interact with the Windows Registry, refer to the “Desktop Administration” section in Appendix A, “WSH Administrative Scripting.” You’ll find two scripts that demonstrate how to perform desktop administration by manip- ulating Registry settings to configure the Windows desktop and screen saver. Back to Part 2 of the Hangman Game Now that you’ve had a review of the Windows Registry, including its overall structure and design, let’s modify the Hangman game to work with the Registry. You might want to take a few minutes to review the design of the Hangman script as shown at the end of Chapter 9. Because you already have the basic Hangman script written, all you have to do to complete this chapter’s project is to focus on creating the new Hangman setup script, and on modify- ing the parts of the original Hangman script affected by the changes. You tackle this project in two stages: creating a setup script that establishes registry settings and updating the Hangman script to retrieve the registry settings each time the game executes. 329 Chapter 10 • Using the Windows Registry to Configure Script Settings . is displayed, providing information about the game and its author. 322 Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition As you can see, the Registry is used to store information. demonstrate the overall flow of the game from beginning to end. Microsoft WSH and VBScript Programming for the Absolute Beginner, Second Edition Figure 10.1 First, you need to run the Hangman setup. this: Set objWshShell = WScript.CreateObject(“WScript.Shell”) objWshShell.RegWrite “HKCUGameKeyHomeFolder”, “C:MyGames VBScript TRAP Microsoft WSH and VBScript Programming for the Absolute Beginner,