Thus, the code at callout A in Listing 2 uses the Select Case statement to test for the computer namethe value of the oNetwork.ComputerName property. If the value is "Gamma", the script assigns the "\\server\printer1" path to the variable sPrintPath; if the value of the property is "Geektoy", the script assigns the "\\server\printer2"path to sPrintPath. So that I don't need to list every computer in the network, I included a Case Else option that represents the path of a typical printer connection"\\server\printer3"for all systems other than "Gamma" or "Geektoy". (If you skip the Case Else line and the ComputerName value passed to the script doesn't match the value in any of the Case option lines, the script simply skips to the first line after End Select.) Again, to use the script that Listing 2 shows, replace the printer paths and computer names with paths and names in your environment.
To connect to printers according to user identity, you can write a similar script that uses the name of the logged-on user (i.e., the value of oNetwork.UserName) as the Select Case argument. Web Listing 1 (http://www.winnetmag.com, InstantDoc ID 25652) shows the Select Case statement for such a script. The rest of the script would look like the Listing 2 script.
User-specific mappings aren't persistent. For example, suppose that Lisa logs on and that the Web Listing 1 statement maps her printer; Lisa then logs off. After Bruce logs on to the same computer and the statement maps his printer, he'll see only his printernot his and Lisa's printers. When you want to disable a computer-specific mapping or a mapping that won't be replaced by another mapping, however, you need to manually remove the printer or call the WshNetwork object's RemovePrinterConnection method, supplying the printer path as an argument. You can include such a call in the logoff script for Win2K computers.
Creating a Location-Specific Printer Connection
The Listing 2 script connects one computer to a default printer, depending on the computer name. But what if you need to connect multiple computers in a location to the printer that's physically close to that locationand repeat this process for several locations? You could add to the Listing 2 script a Select Case statement with a Case option for each computer, or you could create a different version of the script for the computers in each location. In a large network, either option can become cumbersome. A third way exists, though: You can write a script that asks users to tell you where they are (e.g., library, second floor), then connects the user's system to the closest printer. (This type of script requires user input, but as long as you trust your user base to know what part of the building they're in and prompt them for the type of input you want, it should work. You can configure the script either to end or restart if users enter a location that doesn't exist.)
The script in Listing 3 creates an input box that prompts users to specify their location. The VBScript input box always displays an OK button and a Cancel button, but you must specify the user prompt and you can specify two additional optional argumentstitle and defaultto customize the input box's appearance. The title appears in the input box's title bar, and the default is a text string that appears in the input box's text box when the script first displays the input box to the user. The code at callout A in Listing 3 sets the prompt for the input box. The code doesn't set a title or default text, but if you want to do so, you must place the prompt, title, and default arguments in the following order:
InputBox(prompt, title, default)
The prompt and title variables are strings. Therefore, make sure to enclose the strings in quotation marks (").
The script then uses a Select Case statement to evaluate the user input and determine which printer to connect to. If the user typed an invalid choice, the script jumps to the Case Else option, which uses the MsgBox function to display a message box with text you specify and uses the WScript.Quit method to end the script. In other words, the script doesn't connect to a printer if the input provided doesn't match a valid location. Alternatively, the script could assign a generic printer or (to make the example a bit more complicated) prompt the user for a location again (in case the user mistyped the location the first time). Regardless, you must provide some way to end the script or to assign some value to sPrinterPath before the script calls the AddWindowsPrinterConnection method, or an error will occur when the script tries to connect to the printer without a path to use as an argument.
You can use Win2K Group Policy to set default printers or disable the Control Panel Add Printers applet. Also, you can hide shared printers (by ending their names in a dollar sign$) so that users can connect only to the printers programmatically assigned to their username, computer name, or location. This setup will prevent users in Lab A from mistakenly sending their print jobs to Lab Z, three buildings away.
WshNetwork properties and methods aren't the only way to manage printers through VBScriptyou could use the PrintAdmin tool in the Win2K resource kit or Windows Management Instrumentation (WMI) and the Active Directory Service Interfaces (ADSI)but they're the simplest. Don't worry, we'll get to WMI and ADSI in good time.