Est. 1983 Beginner

Novell NetWare login script

The line-by-line command language Novell's LOGIN utility ran every time a user signed in to a NetWare network, used to map drives, set environment variables, show messages and launch programs on DOS, Windows and later Linux workstations

Created by Novell, Inc. (shipped as part of the NetWare LOGIN utility; individual designers not documented)

Paradigm Scripting: imperative, line-oriented command language
Typing Untyped: identifier variables expand to text, and comparisons are textual unless the VALUE modifier is used
First Appeared 1983
Latest Version No version number of its own. Novell's Login Scripts Guide (June 2010) documents the final command set, which the Client for Open Enterprise Server still processes (25.3, July 2025)

The Novell NetWare login script is the small command language that Novell’s LOGIN utility ran every time a user signed in to a NetWare network. A login script was a plain text file of one-line commands. It mapped network drive letters, set DOS environment variables, printed greetings and notices, branched on the user’s group or the day of the week, and started programs or menus. Novell’s own documentation calls login scripts “similar to batch files”. For roughly two decades, it was the piece of NetWare that most office PC users met every morning, often without knowing it was there.

History & Origins

Novell released its first NetWare network operating system in 1983. The original product ran on Novell’s own Motorola 68000-based file server hardware. It was followed by NetWare 86, which used Intel 8086-based PCs as servers, and, according to Wikipedia, in 1985 by Advanced NetWare 86, which let several servers share one network.

When login scripts first appeared is less clear. The OS/2 Museum, which keeps a detailed NetWare release timeline, says it is “very difficult to find authoritative information on NetWare releases prior to 1990 or so.” The earliest primary documentation consulted for this page is the NetWare v2.2 manual set (1991), and it already describes a mature language with three kinds of script, more than twenty commands, and a library of identifier variables. That points to a longer history before 1991, but this page does not claim a specific earlier year. The 1983 date in the header is the year NetWare itself first shipped.

The bindery-era model (NetWare 2.x and 3.x)

The 1991 NetWare v2.2 Concepts manual describes three types of login script:

  • Default login script. Built into LOGIN.EXE in SYS:LOGIN and not editable. It ran when no system or user script existed, which is what a SUPERVISOR saw on first login to a new server.
  • System login script. Written by the network supervisor and run for every user. On NetWare 3.x it was a plain text file, NET$LOG.DAT, in the SYS:PUBLIC directory.
  • User login script. Run after the system script and stored in the user’s own subdirectory under SYS:MAIL. When a user script was changed, a backup copy named LOGIN.BAK was kept.

Scripts were edited in the SYSCON utility. The manual warns that a single blank space typed into a user’s script box in SYSCON counts as a script and stops the default script from running for that user.

The directory-era model (NetWare 4 and later)

NetWare 4.0 (April 1993) introduced NetWare Directory Services (NDS), later renamed eDirectory. Login scripts stopped being files on one server and became properties of directory objects. Novell’s documentation describes four types, run in this order:

  1. Container scripts, attached to an Organization or Organizational Unit, for every user directly in that container.
  2. Profile scripts, attached to Profile objects and shared by groups of users with the same needs.
  3. User scripts, attached to an individual User object.
  4. The default script, still hard-coded into the LOGIN utility. It runs whenever a user has no user script, unless a container or profile script turns it off with NO_DEFAULT.

Design Philosophy

The language was designed for network administrators, not programmers, and it shows:

  • One command per line. Novell’s documentation says the interpreter reads the script one line at a time. Lines that wrap on screen still count as one command.
  • No required structure. All types of login script are optional, there is no minimum length, and blank lines are ignored.
  • Case-insensitive commands. Commands can be typed in upper or lower case. The exception is identifier variables inside quoted strings, which must be upper case.
  • Text-based values. Comparisons in IF statements are made between strings. Novell’s 2010 guide warns that “21” would compare as greater than “100”, and adds a VALUE modifier to force a numeric comparison.
  • Layering over cleverness. The intended pattern is to put as much as possible in the widest-scope script (the system or container script) and keep per-user scripts short, because the last script to run wins any conflict.

Key Features

Commands

The 1991 Using the Network manual and the 2010 Login Scripts Guide together document the core command set:

CommandPurpose
MAPMap a drive letter or search drive to a network directory (MAP INS S1:=SYS:PUBLIC)
IF ... THEN ... ELSE ... ENDRun commands only under certain conditions
WRITEDisplay a message during login
DISPLAY / FDISPLAYShow a text file, raw or with word-processor codes filtered out
INCLUDERun a subscript from a text file (or, later, another object’s login script)
#Run an external program and wait for it to finish
@Run an external program and continue (later Novell clients)
EXITStop processing the script
GOTOJump to a label elsewhere in the script
ATTACHConnect to an additional file server (NetWare 3 and earlier)
DRIVESet the default drive
PAUSEWait for a key press
SHIFTShift the %n command-line parameters
BREAKAllow or block Ctrl+Break interruption of the script
DOS SET / SETSet an environment variable
COMSPECTell DOS where to find COMMAND.COM
REMARKComment (later also REM, * and ;)
FIRE PHASERSPlay a phaser sound

Later NetWare versions added directory-aware commands such as CONTEXT, PROFILE, NO_DEFAULT, TREE, LASTLOGINTIME and REGREAD. Some DOS-era commands, including PCCOMPATIBLE, MACHINE NAME, COMSPEC and DOS VERIFY, only make sense on DOS or Windows 3.x and are left out of the 2010 guide.

Identifier variables

Scripts are made reusable by identifier variables, which LOGIN replaces with real values when the script runs. Inside quoted text they are written in upper case with a leading percent sign:

  • User: LOGIN_NAME, FULL_NAME, LAST_NAME, USER_ID, PASSWORD_EXPIRES, MEMBER OF "group"
  • Date and time: DAY_OF_WEEK, NDAY_OF_WEEK, MONTH_NAME, YEAR, GREETING_TIME, HOUR24
  • Workstation: MACHINE, OS, OS_VERSION, STATION, P_STATION
  • Network: FILE_SERVER, NETWORK_ADDRESS
  • Command line: %0 (the server name) and %1 (the user name) up to %9 for extra parameters typed after LOGIN
  • Environment: any DOS environment variable, written in angle brackets such as <TEMP>

In the eDirectory era any directory attribute can also be read as a variable, for example %HOME_DIRECTORY or %CN.

FIRE PHASERS

The language’s best-known quirk is FIRE PHASERS, which plays a sound effect through the PC speaker. The 1991 manual gives the syntax as FIRE PHASERS n TIMES and says you can fire phasers “up to nine times”. It suggests using the command as an alert, as in IF DAY_OF_WEEK = "Thursday" THEN FIRE PHASERS 3 TIMES. The command outlived DOS. The 2010 guide documents FIRE n soundfile for playing a .wav file on Windows, and says that on Linux the command just prints “BEEP BEEP BEEP”.

Example

Novell’s 2010 Login Scripts Guide prints the default login script built into the LOGIN utility:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
MAP DISPLAY OFF
MAP ERRORS OFF
MAP *1:=%FILE_SERVER\SYS:
MAP *1:=%FILE_SERVER\SYS:%LOGIN_NAME
IF "%LOGIN_NAME"="SUPERVIS" OR "%LOGIN_NAME"="ADMIN" THEN
MAP *1:=%FILE_SERVER\SYS:SYSTEM
MAP INS S1:=%FILE_SERVER\SYS:PUBLIC
MAP INS S2:=%FILE_SERVER\SYS:PUBLIC\%MACHINE\%OS\%OS_VERSION
MAP DISPLAY ON
MAP

*1 means “the first network drive”, whatever its letter turns out to be. S1 and S2 are search drives, NetWare’s way of adding network directories to the DOS PATH. The final bare MAP prints the resulting drive list.

The following is an illustrative system or container script. It uses only commands and variables documented by Novell:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
REM Shared setup for every user
MAP DISPLAY OFF
MAP INS S1:=SYS:PUBLIC
MAP H:=SYS:USERS\%LOGIN_NAME
WRITE "Good %GREETING_TIME, %LOGIN_NAME."

IF MEMBER OF "ACCOUNTING" THEN
   MAP G:=VOL1:ACCOUNTS
END

IF DAY_OF_WEEK="FRIDAY" THEN
   WRITE "Weekly reports are due today."
   FIRE PHASERS 2 TIMES
END

IF DAY_OF_WEEK="MONDAY" THEN
   DISPLAY SYS:PUBLIC\MESSAGES\NEWS.TXT
   PAUSE
END
MAP DISPLAY ON

Limits

The manuals record several hard limits:

  • IF ... THEN statements could be nested up to 10 levels (1991). The 2010 guide gives 10 levels on Windows and 100 on Linux.
  • INCLUDE nesting was limited only by memory (1991). The 2010 guide caps it at 10 levels on DOS.
  • In the 1991 manual, EXIT "command" could pass a command of at most 14 characters to COMMAND.COM, and EXIT worked only on IBM PCs unless the script first ran PCCOMPATIBLE.
  • The 2010 guide allows lines of up to 512 characters, counting the text that variables expand to.

Evolution

The language grew mainly by adding commands, not by changing its syntax:

  • NetWare 2.x and 3.x (bindery era): system and user scripts, SYSCON for editing, ATTACH for connecting to more servers, and DOS-specific commands such as COMSPEC, PCCOMPATIBLE and DOS BREAK.
  • NetWare 4.x (NDS era): container and profile scripts, directory-aware commands such as CONTEXT, PROFILE and NO_DEFAULT, and INCLUDE of another object’s script. Novell’s 2010 guide notes that in NetWare 4 and later, users “no longer need to attach separately to multiple servers”.
  • Later Novell clients: commands and variables missing from the 1991 list but documented in Novell’s 2010 guide include @ for starting a program without waiting for it, REGREAD for reading the Windows registry, SET_TIME, sound files for FIRE, and WINVER and SHELL_VERSION. The sources consulted do not date each addition.
  • Novell Client for Linux: Novell ported “the vast majority of login script functionality” to Linux. MAP creates symbolic links to mount points there, and OS="LINUX" lets one script serve both platforms. DRIVE, SCRIPT_SERVER and SET_TIME do not work on Linux.

Third-party implementations followed the language’s popularity. Microsoft’s Windows 95 Client for NetWare Networks ran NetWare 3.x system and user scripts over bindery connections, but could not load real-mode TSRs from them. Windows 2000 and Server 2003 included Nwscript.exe as the login script processor for Client Service for NetWare.

Current Relevance

NetWare is gone. Its final update, NetWare 6.5 SP8, came out in May 2009, and general support for NetWare 6.x ended in March 2010. That is why the encyclopedia lists the language as Historical.

The language itself has outlived the operating system it was built for. NetWare’s file and directory services moved to Open Enterprise Server (OES) on SUSE Linux Enterprise. Novell became part of Micro Focus and, later, OpenText. The current Windows client, now called the Client for Open Enterprise Server, still processes login scripts stored in eDirectory. Its release notes for versions 24.4 (October 2024) and 25.3 (July 2025) both direct administrators to the Novell Login Scripts Guide. On the networks that still run eDirectory and OES, MAP and IF MEMBER OF are still in use.

Why It Matters

NetWare login scripts ran on every workstation that logged in to a NetWare network, yet hardly anyone thought of them as a language. They had conditionals, jumps, subroutine-like includes, parameters and variables, and they were written mostly by system administrators, not developers. The language set the pattern for centrally managed workstation setup that later systems kept: run a script at sign-on, give users their drives and printers, and tailor the result by group, location or machine type. That Microsoft built NetWare login script interpreters into Windows 95 and Windows NT-family clients shows how much of the installed base depended on it. Its best-remembered command, FIRE PHASERS, shows that a language for network administrators could still have a sense of humour.

Timeline

1983
Novell releases the first NetWare network operating system, which runs on Novell's own Motorola 68000-based file server hardware
1985
According to Wikipedia, Advanced NetWare 86 replaces NetWare 86 and lets more than one file server share the same network (the OS/2 Museum timeline's earliest dated entry is NetWare/86 v2.0a, January 1986)
1989
NetWare 386 (version 3.0) ships in September. On NetWare 3.x the system login script is a plain text file, NET$LOG.DAT, in SYS:PUBLIC
1991
NetWare v2.2 ships in March. Its manuals describe default, system and user login scripts and list commands including ATTACH, MAP, IF...THEN, INCLUDE, GOTO, SHIFT, PCCOMPATIBLE and FIRE PHASERS
1993
NetWare 4.0 ships in April with NetWare Directory Services. Login scripts become properties of directory objects, and container, profile, user and default scripts replace the system-plus-user model
1995
Microsoft's Windows 95 ships with Client for NetWare Networks, which runs NetWare 3.x system and user login scripts over bindery connections
2009
NetWare 6.5 SP8, the final NetWare update, is released in May
2010
General support for NetWare 6.x ends in March. Novell's June 2010 Login Scripts Guide documents the language for the Novell Client for Windows and Linux, where scripts are stored in eDirectory
2025
OpenText's Client for Open Enterprise Server 25.3 (July) still points administrators to the Novell Login Scripts Guide, so the language keeps running on OES networks after NetWare itself

Notable Uses & Legacy

NetWare drive mapping

The main job of most login scripts was to MAP network drive letters and DOS search drives, such as the standard search-drive mapping to SYS:PUBLIC that gave every user access to the NetWare utilities

Novell Automatic Client Update (ACU)

Novell's documentation shows calling SETUPNW.EXE /ACU with the # command from a login script to upgrade the Novell Client on every workstation without visiting each machine

Microsoft Windows 95 Client for NetWare Networks

Microsoft's own NetWare client ran NetWare 3.x system and user login scripts (but not commands that load TSRs), so Windows 95 desktops could join NetWare networks without Novell's client software

Microsoft Client Service for NetWare

Windows 2000 and Windows Server 2003 shipped a login script processor, Nwscript.exe, that ran NetWare login scripts for users of Microsoft's Client Service and Gateway Service for NetWare

Novell NetStorage

Novell's web-based file access service reads a user's eDirectory login scripts to find MAP statements, turning each one into a path the user can browse, and ignores everything except MAP, IF, THEN, ELSE, END, INCLUDE and EXIT

Running Today

Run examples using the official Docker image:

docker pull
Last updated: