Users vs. Network Printers in WinXP

It’s been a problem we’ve struggled with here for much longer than we should have, and it took a hotshot new guy in desktop support to show us the answer. But if you know the right magic, you can add a printer to Windows XP and make it available to all users.

See, if you add the printer using the “add printer” wizard, it’s available only to that user. But if you use the command line, then you can throw a switch to make it available to any user who logs in to that machine. Here’s the instructions he offered us:

  1. Log in to the domain with an administrative account.
     
  2. Type the following into the command prompt:

    rundll32 printui.dll,PrintUIEntry /ga /n\\printers\%printername%

    In other words, to add mylj03, the command line is:

    rundll32 printui.dll,PrintUIEntry /ga /n\\printers\mylj03
     

  3. The printer is now available to all users who log in with a domain account.

update: Alan Baker wants me to make it clear that we’ve been able to do this all along. He explains that a user with administrative privileges could add a network printer on a local port, and make it available to all users. Point taken. Counterpoint: why is Windows so freakin’ useless? Neither solution works as well as a little “make available to all users” checkbox would.

windows, windows xp, xp, win xp, printers, network printers, add a printer, users, user permissions, broken, workaround, xp user permissions

14 thoughts on “Users vs. Network Printers in WinXP

  1. Well yes, it’s technically possible to add a network printer as a local printer, but that means you have to install drivers locally/pray they’re included in XP SP2. When you connect properly, however, the driver gets updated on the server side–ergo, when we put in a new printer, we also can update everyone’s drivers by changing just one set. Nifty keen, no?

  2. The command works just fine.
    I did a small test; I used the command one time with the right printer name and path, second time I used a wrong printer name, every time the user is loged in the wrong printer is beening mapped. Here is my question; Where in windows the command is stored that makes the printer mapping every login?

  3. worked just fine, with the exception of my inability to spell. How does one go about deleting the printer for all users.

  4. Well since noone else mentioned it yet, I’d like to ask:

    By simply removing the /ga portion of the command can one map a printer without setting it available to all users?

    Also, does this support mapping numerous printers such as one each of a color and b&w printer?

    Thanks.

    [tags]Multi-printer support?[/tags]

  5. Pingback: Bill’s Weblog » Install Network Printers for All Users in Windows XP

  6. @justin:
    Use the /in switch instead of the /ga one. Run “rundll32 printui.dll,PrintUIEntry /?” at the command line to see all the options.

    @Delano & h00n3r:
    Per-user connections (or mappings) are stored in the registry in [HKEY_CURRENT_USER\Printers\Connections], and per-machine connections in [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Connections]. Note that per-machine connections will also show up in user’s connections (since they get copied when one logs in). To delete those tricky per-machine connections, remove the appropriate keys in [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Connections] and [HKEY_CURRENT_USER\Printers\Connections], then restart the spooler service (run at the command line “net stop spooler” then “net start spooler”)

  7. Here is the help for the printui.dll that Jonathan mentioned:

    Usage: rundll32 printui.dll,PrintUIEntry [options] [@commandfile]
    /a[file] binary file name
    /b[name] base printer name
    /c[name] unc machine name if the action is on a remote machine
    /dl delete local printer
    /dn delete network printer connection
    /dd delete printer driver
    /e display printing preferences
    /f[file] either inf file or output file
    /ga add per machine printer connections
    /ge enum per machine printer connections
    /gd delete per machine printer connections
    /h[arch] driver architecture one of the following, Alpha | Intel | IA64 | x64
    /ia install printer driver using inf file
    /id install printer driver using add printer driver wizard
    /if install printer using inf file
    /ii install printer using add printer wizard with an inf file
    /il install printer using add printer wizard
    /in add network printer connection
    /j[provider] print provider name
    /k print test page to specified printer, cannot be combined with command when installing a printer
    /l[path] printer driver source path
    /m[model] printer driver model name
    /n[name] printer name
    /o display printer queue view
    /p display printer properties
    /q quiet mode, do not display error messages
    /r[port] port name
    /s display server properties
    /Ss Store printer settings into a file
    /Sr Restore printer settings from a file
    Store or restore printer settings option flags that must be placed at the end of command:
    2 PRINTER_INFO_2
    7 PRINTER_INFO_7
    c Color Profile
    d PrinterData
    s Security descriptor
    g Global DevMode
    m Minimal settings
    u User DevMode
    r Resolve name conflicts
    f Force name
    p Resolve port
    /u use the existing printer driver if it’s already installed
    /t[#] zero based index page to start on
    /v[version] driver version one of the following, Windows 95, 98 and Me | Windows NT 4.0 | Windows NT 4.0 or 2000 | Windows 2000 or XP | Windows XP
    /w prompt the user for a driver if specified driver is not found in the inf
    /y set printer as the default
    /Xg get printer settings
    /Xs set printer settings
    /z do not auto share this printer
    /Y do not auto generate a printer name
    /K changes the meaning of /v and /h to accept 0,1,2,3, respectively for Windows x64 and Windows IA64 | Windows NT x86 | Windows NT Alpha_AXP | Windows 4.0
    /Z share this printer, can only be used with the /if option
    /? help this message
    @[file] command line argument file
    /Mw[message] show a warning message before committing the command
    /Mq[message] show a confirmation message before committing the command
    /W[flags] specifies flags and switches for the wizards (for APW & APDW)
    r make the wizards to be restart-able from the last page
    /G[flags] specifies global flags and switches
    w suppress setup driver warnings UI (super quiet mode)

    Examples:
    Run server properties:
    rundll32 printui.dll,PrintUIEntry /s /t1 /n\\machine
    Run printer properties:
    rundll32 printui.dll,PrintUIEntry /p /n\\machine\printer
    Run add printer wizard localy:
    rundll32 printui.dll,PrintUIEntry /il
    Run add printer wizard on \\machine:
    rundll32 printui.dll,PrintUIEntry /il /c\\machine
    Run queue view:
    rundll32 printui.dll,PrintUIEntry /o /n\\machine\printer
    Run inf install:
    rundll32 printui.dll,PrintUIEntry /if /b “Test Printer” /f %windir%\inf\ntprint.inf /r “lpt1:” /m “AGFA-AccuSet v52.3″
    Run add printer wizard using inf:
    rundll32 printui.dll,PrintUIEntry /ii /f %windir%\inf\ntprint.inf
    Add per machine printer connection:
    rundll32 printui.dll,PrintUIEntry /ga /c\\machine /n\\machine\printer /j”LanMan Print Services”
    Delete per machine printer connection:
    rundll32 printui.dll,PrintUIEntry /gd /c\\machine /n\\machine\printer
    Enumerate per machine printer connections:
    rundll32 printui.dll,PrintUIEntry /ge /c\\machine
    Add printer driver using inf:
    rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m “AGFA-AccuSet v52.3″ /h “Intel” /v “Windows 2000 or XP” /f %windir%\inf\ntprint.inf
    Add printer driver using inf:
    rundll32 printui.dll,PrintUIEntry /ia /K /c\\machine /m “AGFA-AccuSet v52.3″ /h “Windows NT x86″ /v 3
    Remove printer driver:
    rundll32 printui.dll,PrintUIEntry /dd /c\\machine /m “AGFA-AccuSet v52.3″ /h “Intel” /v “Windows 2000 or XP”
    Remove printer driver:
    rundll32 printui.dll,PrintUIEntry /dd /K /c\\machine /m “AGFA-AccuSet v52.3″ /h “Windows NT x86″ /v 3
    Set printer as default:
    rundll32 printui.dll,PrintUIEntry /y /n “printer”
    Set printer comment:
    rundll32 printui.dll,PrintUIEntry /Xs /n “printer” comment “My Cool Printer”
    Get printer settings:
    rundll32 printui.dll,PrintUIEntry /Xg /n “printer”
    Get printer settings saving results in a file:
    rundll32 printui.dll,PrintUIEntry /f “results.txt” /Xg /n “printer”
    Set printer settings command usage:
    rundll32 printui.dll,PrintUIEntry /Xs /n “printer” ?
    Store all printer settings into a file:
    rundll32 printui.dll,PrintUIEntry /Ss /n “printer” /a “file.dat”
    Restore all printer settings from a file:
    rundll32 printui.dll,PrintUIEntry /Sr /n “printer” /a “file.dat”
    Store printer information on level 2 into a file :
    rundll32 printui.dll,PrintUIEntry /Ss /n “printer” /a “file.dat” 2
    Restore from a file printer security descriptor:
    rundll32 printui.dll,PrintUIEntry /Sr /n “printer” /a “file.dat” s
    Restore from a file printer global devmode and printer data:
    rundll32 printui.dll,PrintUIEntry /Sr /n “printer” /a “file.dat” g d
    Restore from a file minimum settings and resolve port name:
    rundll32 printui.dll,PrintUIEntry /Sr /n “printer” /a “file.dat” m p

  8. Hi,
    I believe the document is exactly what I was looking for. I was so delighted to read it.
    I thought of starting with a simple command first to Add a Printer from a netowrk drive before I could add the printer per machine.

    I am facing a problem with the following commands (from C:\Documents and Settings\smalik prompt)to add a printer from Network.

    rundll32 printui.dll PrintUIEntry /in /n\\Hops1\”Business Change”

    where “Business Change” is a printer on \\Hops1.
    The command throws up a message saying “Connecting to \\Hops1\”Business and then eventually fails to find the printer.

    Interestingly the command (Please notice the missing quotes):
    rundll32 printui.dll PrintUIEntry /in /n\\Hops1\Business Change
    gives a slightly diferent message “Connecting to Business on Hops1″ (instead of “Connecting to \\Hops1\”Business ) which again fails eventually.

    But I am able to add the printer “Business Change” from \\Hops1 using the Add Printer Wizard.
    I guess I have to put a escape character.

    Any help would be greatly appreciated.

    Thanks
    Satya.

  9. I had tried to install another Network Printer which does not have a space in its name. I was delighted to see that it actually works.

    It fails to Add printers which have spaces in its name. I have tried using quotes(“) and percentage (%) and it does not seem to work.
    Any idea what syntax I should use?

  10. Thanks all for this post,

    It is exactly what I needed. To know such a tool is in windows and no one knows about it. Wow, the ability to delete and add network printer using a batch file now. I was facing a big task, but now it will take a fraction of the time.

    Again thanks so much!!!!

  11. @Satya “Business Change” PrinterName

    Does Busine~1 work?

    Obviously you cannot have other PrinterNames which start with Busines

  12. To Satya:
    Here is the right command:
    rundll32 printui.dll PrintUIEntry /in /n”\\Hops1\Business Change”
    if you have spaces in the printer name.

  13. This doesn’t appear to work if you try to issue it on the remote workstation during an rdp session. Somehow it magically installed the printer on the local workstation. (And NO…I didn’t issue it from a local command prompt accidentally) :)

Comments are closed.