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)
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:
- Container scripts, attached to an Organization or Organizational Unit, for every user directly in that container.
- Profile scripts, attached to Profile objects and shared by groups of users with the same needs.
- User scripts, attached to an individual User object.
- 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
IFstatements are made between strings. Novell’s 2010 guide warns that “21” would compare as greater than “100”, and adds aVALUEmodifier 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:
| Command | Purpose |
|---|---|
MAP | Map a drive letter or search drive to a network directory (MAP INS S1:=SYS:PUBLIC) |
IF ... THEN ... ELSE ... END | Run commands only under certain conditions |
WRITE | Display a message during login |
DISPLAY / FDISPLAY | Show a text file, raw or with word-processor codes filtered out |
INCLUDE | Run 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) |
EXIT | Stop processing the script |
GOTO | Jump to a label elsewhere in the script |
ATTACH | Connect to an additional file server (NetWare 3 and earlier) |
DRIVE | Set the default drive |
PAUSE | Wait for a key press |
SHIFT | Shift the %n command-line parameters |
BREAK | Allow or block Ctrl+Break interruption of the script |
DOS SET / SET | Set an environment variable |
COMSPEC | Tell DOS where to find COMMAND.COM |
REMARK | Comment (later also REM, * and ;) |
FIRE PHASERS | Play 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%9for extra parameters typed afterLOGIN - 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 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:
| |
Limits
The manuals record several hard limits:
IF ... THENstatements could be nested up to 10 levels (1991). The 2010 guide gives 10 levels on Windows and 100 on Linux.INCLUDEnesting 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, andEXITworked only on IBM PCs unless the script first ranPCCOMPATIBLE. - 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,
ATTACHfor connecting to more servers, and DOS-specific commands such asCOMSPEC,PCCOMPATIBLEandDOS BREAK. - NetWare 4.x (NDS era): container and profile scripts, directory-aware commands such as
CONTEXT,PROFILEandNO_DEFAULT, andINCLUDEof 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,REGREADfor reading the Windows registry,SET_TIME, sound files forFIRE, andWINVERandSHELL_VERSION. The sources consulted do not date each addition. - Novell Client for Linux: Novell ported “the vast majority of login script functionality” to Linux.
MAPcreates symbolic links to mount points there, andOS="LINUX"lets one script serve both platforms.DRIVE,SCRIPT_SERVERandSET_TIMEdo 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
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