Lead Image © Andrey KOTKO, 123RF.com

Lead Image © Andrey KOTKO, 123RF.com

Comparing Logon Script Alternatives

Scripting Competition

Article from ADMIN 26/2015
We compare the performance of batch, VBScript, and PowerShell commands with four standard tasks.

Logon scripts provide an important service when setting up a PC workstation: They create an individual workplace environment for each employee based on the employee's logon context. On Windows XP, scripting was limited to batch files and VBScripts; however, PowerShell has elevated the scripting game since Windows 7.

Is PowerShell really so much better, though? To try and find some clarity in this matter, I put the three technologies – batch (statements and binaries interpreted by cmd.exe), VBScript (Visual Basic Script Edition, processed by Wscript.exe or cscript.exe), and PowerShell (version 3; console with additional script engine for PS1 files) – to the test. In doing so, I consider:

  • How powerful is each technology?
  • What are the limitations and restrictions?
  • How intuitive is each technology, and how well is it documented?

Objective and Scenario

Logon script targets can be divided roughly into two areas: infrastructure and local system. Infrastructural objectives could be managing shares, particularly mapping network drives, or connecting a network printer and setting the default printer. For local systems, it might be necessary to run programs, change a registry key, or create a link.

The typical tasks I will give the three Microsoft scripting engines in this test involve mapping shares, adding a network printer, running a file, and changing the registry. Additionally, I expect to see output in the event of an error.

Mapping Shares

Connecting to shares on a server is a standard task in setting up a desktop. The DOCS share on server SRV will be mapped as drive M . To simplify matters, I am omitting the transfer of user information for securing rights for this action.

Batch: The batch command for this action is:

net use m: \\SRV\DOCS

The net.exe file handles this command. The mixture of command interpreter access and commands is typical of batch files.

VBScript: The VBScript command is:

Set ObjNet = Wscript.CreateObject("Wscript.Network")

A VBScript logon script only provides the control constructs such as loops, branches, and so on. The actual functionality is in a collection of component object model (COM) objects (standard for software development at Microsoft) – in particular, the Windows Script Host (WSH) run-time library.

In this example, I create an object based on the WScript.Network class in order to then use the MapNetworkDrive method.

PowerShell: The PowerShell command is:

New-PsDrive -name m -Root \\SRV\DOCS \
   -PsProvider FileSystem -persist

PowerShell uses the cmdlet command type. Simplified, cmdlets can be understood as an extension of .NET types. The <verb>-<noun> structure makes usage very intuitive. Here, the New action is connected with the PsDrive target.

Printer Management

The second step involves sharing a network printer with the user. The server has the familiar name SRV , and the shared printer is referred to as PP . I also want this printer to be the default printer.

Batch: First up is the batch command:

Rundll32 printui.dll,PrintUIEntry /in /n /Y \\SRV\PP

The Rundll32.exe application steps into the breach for the weak internal commands of command.com. Here, it defines the printer as a network printer (/in) with a name (/n) in the form of \\<server>\<sharing name>. The default printer property is set with the /Y option.

VBScript: Visual Basic uses the following command chain for printer configuration:

Set ObjNet = Wscript.CreateObject("Wscript.Network")

This is the second WScript.Network type method. VBScript proves to rely very heavily on COM. Later, I will look at whether this is an advantage or disadvantage.

The same object can also carry out part two of the task,


which defines the printer as the default.

PowerShell: PowerShell is more flexible with this command:

$pr = get-WmiObject -Class "win32_Printer"

It can access, among other things, .NET types and WMI classes. The new printer receives the default flag,

$default = get-wmiObject -Class win32_Printer \
   -Filter "name = 'PP'"

which identifies it in the list of available printers. This is somewhat elaborate, but meaningful.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy ADMIN Magazine

Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

comments powered by Disqus
Subscribe to our ADMIN Newsletters
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs

Support Our Work

ADMIN content is made possible with support from readers like you. Please consider contributing when you've found an article to be beneficial.