Remove all network printers with a batch file

Is this possible?

I am assuming I would use the NET USE * /DELETE but that just deletes all network drives.
noodleNTAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

SteveGTRCommented:
You could try something like this on NT and XP:

@echo off

for /F "tokens=2-3" %%a in ('net use') do call :LOOKAT %%a %%b

set test=

goto EXIT

:LOOKAT

set test=%1

if not "%test:~0,3%"=="LPT" goto EXIT

net use %2 /DEL

:EXIT

Good Luck,
Steve
0
noodleNTAuthor Commented:
It looks like NET USE can only be used for mapped drives. How can I do this type of thing with printers?
0
SteveGTRCommented:
Here's a usage that I do when I startup my system:

@echo off

net use | findstr LPT1> NUL
if ERRORLEVEL 1 goto CAPTUREIT
goto EXIT

:CAPTUREIT
net use LPT1: \\OneOfOurNetworkPrinters\PRINTER

:EXIT
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

noodleNTAuthor Commented:
Does this not work on XP?

When I type NET USE  I see zero network printers even though I have 10 of them.
0
noodleNTAuthor Commented:
Would using this command do a better job for adding and removing network printers?

rundll32 printui.dll,PrintUIEntry /?
0
noodleNTAuthor Commented:
Alright.... Point increased!

I have another guy at work looking into this now and we both are stuck.

It looks like to add and remove printers we will need to use the PrintUI.dll

our server is \\printserver
the printer is \shared_office_printer

tried using:  
rundll32 printui.dll, PrintUIEntry /y /n \\printserver\shared_office_printer  

But I get a syntax error???
0
noodleNTAuthor Commented:
Correction.... Operation could not be completed error.
0
SteveGTRCommented:
Try:

net view

to see your network printers.
0
noodleNTAuthor Commented:
Hehe... just saw that a few minutes ago.  I got something working here!!


------------------------------------------------------------------------------------------
:Start
ECHO Add all network printers.
ECHO Please Wait...

for /F "tokens=1,2,*" %%a in ('net view \\%svrname%') do call :LOOKAT %%a %%b
set test=

goto :Drive

:LOOKAT

set test=%2
ECHO Test= %test%
pause

if not "%test%"=="Print" goto Exit
ECHO Adding Printer \\%svrname%\%1
pause
RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /n\\%svrname%\%1

:Drive

NET USE Z: /Delete
NET USE Z: \\%svrname%\%sharename%

:Exit

---------------------------------------------------------------------------------------------------------------


Now unfortunatly we have added printer share names with spaces. Like "Office Shared Printer". Is there a way around this so it pics up the full shared printer name.
0
oBdACommented:
The simplest solution by far is still con2prt.exe (from the Zero Administration Kit); you can map network printers with it, but in this case, the simple command
con2prt /f
will delete all network printers.

Zero Administration Kit
http://www.microsoft.com/ntworkstation/downloads/Recommended/Featured/NTZAK.asp

How to Use Con2prt.exe to Connect to a Network Printer
http://support.microsoft.com/?kbid=181663
0
noodleNTAuthor Commented:
I am not going to deal with the kit if I dont have to.
I would rather hard code the printers.
0
oBdACommented:
Hm? There's no need to "deal" with the kit. All you need is con2prt.exe, and to get that, it's enough to download the .exe and extract the single file with the zip utility of your choice.
0
noodleNTAuthor Commented:
I tried using the con2prt.exe on my XP machine and got an error that it is not a valid program.
0
noodleNTAuthor Commented:
Here is the code that works with SHORT SHARE NAMES ONLY! (No spaces in printer share names, IE: "Shared_Printer" instead of "Shared Printer"

_______________________________________________________________________________________ Start Copy
@ECHO OFF

REM Set new server name here for Bethesda Office.
REM ---------------------------------------------

Set svrname=

REM Set new server shared folder here for Bethesda Office.
REM ------------------------------------------------------

Set sharename=


REM Do not change anything below this line!
REM ------------------------------------------------------------------

SET Proccess=Start


:Header
CLS
ECHO *********************************
ECHO *****   Network Resources ****
ECHO ******    Version 1.0      ******
ECHO ******   By Nick Thoman    ******
ECHO *********************************
ECHO.
ECHO !!!!!!!! DO NOT CLOSE !!!!!!!!!!
ECHO.
ECHO ___________________________________________________________________________
Goto %Proccess%


:Start
ECHO Removing all Network Devices.
ECHO Please Wait...

for /F "tokens=1,2,*" %%a in ('net view \\%svrname%') do call :Delete %%a %%b
set test=
Set Proccess=Add_resources
Goto Header



:Add_resources
ECHO Add all network printers.
ECHO Please Wait...

for /F "tokens=1,2,*" %%a in ('net view \\%svrname%') do call :ADD %%a %%b
set test=
Set Proccess=Drive
goto Header


:Delete
set test=%2
ECHO Test= %test%

if not "%test%"=="Print" goto Exit
ECHO Removing Printer \\%svrname%\%1
RUNDLL32 PRINTUI.DLL,PrintUIEntry /dn /n\\%svrname%\%1
GOTO EXIT


:ADD
set test=%2
ECHO Test= %test%

if not "%test%"=="Print" goto Exit
ECHO Adding Printer \\%svrname%\%1
RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /n\\%svrname%\%1
GOTO EXIT

:Drive
NET USE Z: /Delete
NET USE Z: \\%svrname%\%sharename%

:Exit
_____________________________________________________________________________ End Copy



IF there is a way around the spaces in shared names without using con2prt then please share!
0
SteveGTRCommented:
Put double quotes around them:

NET USE Z: "\\%svrname%\%sharename%"
0
noodleNTAuthor Commented:
The problem is with the Tokens when searching for the the Printers.
0
noodleNTAuthor Commented:
Is there a way to set the Delims to more than one Space?
0
SteveGTRCommented:
I see. That will be a problem.

Also, if the Share name is longer than 13 characters a linefeed is done and the Type appears on the next line indented.
0
noodleNTAuthor Commented:
What if we do something like this....
If we take in say 8 tokens like this,

for /F "tokens=1-8*" %%a in ('net view \\%svrname%') do call :ADD %%a %%b

That should grab all the long names plus the print column.

Then do something like...
Set Printername=%1
set test=%2
if not "%test%"=="Print" goto checknext

:checknext
Set Printername=%1 %2
Set Test=%3
If not "%test%"=="Print"

and so on loop it so it builds the longer printer name. Printername could be equal to %1 %2 %3 %4
then once it finds a printer have it do this this....

RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /q /n"\\%svrname%\%Printername%"

Would that work and if so how would you Loop something like that?

Note..... Points increased!

0
noodleNTAuthor Commented:
damn 500 point max
0
noodleNTAuthor Commented:
I have a counting loop that increases from 1 to 9

I want to change the Test value to be dynamic but still pull the correct Tockens. I am trying something like this...

Set  String=%%%count%
Set Printername= %Printername% %string%
set test=%string%
ECHO Test=%test%

<rest of counting loop>


Even though string is returning %1 when I pass that value to the Test variable it does not load the TOKEN value.
Is there a way around this? I have done simular things in flash and have had no problems.
0
noodleNTAuthor Commented:
Got something that works!
Just pug in your Old server name, Your New server name and Your Shared folder for a mapped network drive.
Can I give myself points for solving my own question? =)
If someone can find a cleaner way to do this, feel free to post it!

This should work on 2k and XP.

<------------------------------ Start Copy ------------------------------------>
@ECHO OFF

REM Set server name here for Bethesda Office.
REM ---------------------------------------------

Set Oldsvrname=<YOUR OLD SERVER>
Set Newsvrname=<YOUR NEW SERVER>

REM Set new server shared folder here for Bethesda Office.
REM ------------------------------------------------------

Set sharename=<YOUR NETWORK SHARED FOLDER>


REM Do not change anything below this line!
REM ------------------------------------------------------------------

SET Proccess=Start

:Header
CLS
ECHO *********************************
ECHO *****   Network Resources   ****
ECHO ******    Version 3.8      ******
ECHO ******   By Nick Thoman    ******
ECHO *********************************
ECHO.
ECHO !!!!!!!! DO NOT CLOSE !!!!!!!!!!
ECHO.
ECHO ___________________________________________________________________________
Goto %Proccess%


:Start
ECHO Removing all Network Devices.
ECHO Please Wait...

for /F "tokens=1-8" %%a in ('net view "\\%Oldsvrname%"') do call :Delete %%a %%b %%c %%d %%e %%f %%g %%h
for /F "tokens=1,2*" %%a in ('net view "\\%Oldsvrname%"') do call :DeleteShort %%a %%b

set test=
Set Proccess=Add_resources
Goto Header

:Add_resources
ECHO Add all network printers.
ECHO Please Wait...

for /F "tokens=1-8" %%a in ('net view "\\%Newsvrname%"') do call :Add %%a %%b %%c %%d %%e %%f %%g %%h
set test=
Set Proccess=Drive
goto Header


:Deleteshort
ECHO Deleting Printers with Shortname Shares.
ECHO Please Wait...

set test=%2
ECHO Test= %test%

if not "%test%"=="Print" goto Exit
ECHO Removing Printer \\%Oldsvrname%\%1
RUNDLL32 PRINTUI.DLL,PrintUIEntry /dn /q /n\\%Oldsvrname%\%1
GOTO EXIT


:Delete
Set V1=%1
Set V2=%2
Set V3=%3
Set V4=%4
Set V5=%5
Set V6=%6
Set V7=%7
Set V8=%8

If "%V1%"=="Print" (
      Echo Match: %V1%
      Goto DelPrinter
) ELSE (
      Set Printname=%V1% %v2%
      Echo Printer String: "%Printername%"
)

If "%V2%"=="Print" (
      Set Printername=%V1%
      Goto DelPrinter
) ELSE (
      If not "%V2%"=="" Set Printername=%V1% %V2%
      Echo Printer String: "%Printername%"
)

If "%V3%"=="Print" (
      Echo Match: %V3%
      Goto DelPrinter
) ELSE (
      If not "%V3%"=="" Set Printername=%Printername% %V3%
      Echo Printer String: "%Printername%"
)

If "%V4%"=="Print" (
      Echo Match: %V4%
      Goto DelPrinter
) ELSE (
      If not "%V4%"=="" Set Printername=%Printername% %V4%
      Echo Printer String: "%Printername%"
)

If "%V5%"=="Print" (
      Echo Match: %V5%
      Goto DelPrinter
) ELSE (
      If not "%V5%"=="" Set Printername=%Printername% %V5%
      Echo Printer String: "%Printername%"
)
If "%V6%"=="Print" (
      Echo Match: %V6%
      Goto DelPrinter
) ELSE (
      If not "%V6%"=="" Set Printername=%Printername% %V6%
      Echo Printer String: "%Printername%"
)
If "%V7%"=="Print" (
      Echo Match: %V7%
      Goto DelPrinter
) ELSE (
      If not "%V7%"=="" Set Printername=%Printername% %V7%
      Echo Printer String: "%Printername%"
)
If "%V8%"=="Print" (
      Echo Match: %V7%
      Goto DelPrinter
) ELSE (
      Echo No printers found on this line.
      Goto Exit
)

:DelPrinter
ECHO Removing Printer "\\%Oldsvrname%\%Printername%"

If not "%Printername%"=="" RUNDLL32 PRINTUI.DLL,PrintUIEntry /dn /q /n"\\%Oldsvrname%\%Printername%"
Set Printername=
GOTO EXIT


:ADD
Set V1=%1
Set V2=%2
Set V3=%3
Set V4=%4
Set V5=%5
Set V6=%6
Set V7=%7
Set V8=%8


If "%V1%"=="Print" (
      Echo Match: %V1%
      Goto AddPrinter
) ELSE (
      Set Printname=%V1% %v2%
      Echo Printer String: "%Printername%"
)

If "%V2%"=="Print" (
      Set Printername=%V1%
      Goto AddPrinter
) ELSE (
      If not "%V2%"=="" Set Printername=%V1% %V2%
      Echo Printer String: "%Printername%"
)

If "%V3%"=="Print" (
      Echo Match: %V3%
      Goto AddPrinter
) ELSE (
      If not "%V3%"=="" Set Printername=%Printername% %V3%
      Echo Printer String: "%Printername%"
)

If "%V4%"=="Print" (
      Echo Match: %V4%
      Goto AddPrinter
) ELSE (
      If not "%V4%"=="" Set Printername=%Printername% %V4%
      Echo Printer String: "%Printername%"
)

If "%V5%"=="Print" (
      Echo Match: %V5%
      Goto AddPrinter
) ELSE (
      If not "%V5%"=="" Set Printername=%Printername% %V5%
      Echo Printer String: "%Printername%"
)
If "%V6%"=="Print" (
      Echo Match: %V6%
      Goto AddPrinter
) ELSE (
      If not "%V6%"=="" Set Printername=%Printername% %V6%
      Echo Printer String: "%Printername%"
)
If "%V7%"=="Print" (
      Echo Match: %V7%
      Goto AddPrinter
) ELSE (
      If not "%V7%"=="" Set Printername=%Printername% %V7%
      Echo Printer String: "%Printername%"
)
If "%V8%"=="Print" (
      Echo Match: %V7%
      Goto AddPrinter
) ELSE (
      Echo No printers found on this line.
      Goto Exit
)

:AddPrinter
ECHO Adding Printer "\\%Newsvrname%\%Printername%"

If not "%Printername%"=="" RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /q /n"\\%Newsvrname%\%Printername%"
Set Printername=
GOTO EXIT

:Drive
NET USE Z: /Delete
NET USE Z: \\%Newsvrname%\%sharename%

:Exit

<---------------------------------- END COPY ----------------------------------------->
0
oBdACommented:
For the sake of completeness: I have con2prt.exe running on NT, W2k and XP just fine. You might want to check if the archive and/or your zip program (if you used that instead of running zak.exe) is running OK. When you view the file in Explorer, it should have a size of 33.040 Bytes, the version should be 4.0.1381.1. When you open the file in notepad, the first two characters should be the famous MZ, towards the end, you should be able to see the help output.
I just try to avoid the printui.dll, since it's not really meant to be used in a batch file and it's impossible to check if the operation was successful.
0
noodleNTAuthor Commented:
Well this needs to run on over 140 machines. Would that con2prt.exe need to be added to each machine?
0
oBdACommented:
No. If this is a logon script, just put con2prt.exe it in the netlogon share. Otherwise, just put it into the same directory as your cmd file or add a UNC path like \\SomeServer\SomeShare\con2prt.exe. It's just a stand-alone executable, no installation required.
0
noodleNTAuthor Commented:
Cleaned up code that can handle longer names when the "PRINT" token is pushed to a new line. It also verifies the first "Print" is the "Print" we are looking for and not in the name of the share.

Reason for this is do some poor naming criteria done at the office prior to my hire. There was a printer added that was called "Office Copier-Scanner Print". The new server fixes this short site but this script will clean it up.

<<<<-------------------------Start Copy----------------------------------->>>>

@ECHO OFF

REM Set server name here for Office.
REM ------------------------------------------------------------------

Set Oldsvrname=<OLD SERVER>
Set Newsvrname=<NEW SERVER>

REM Set new server shared folder here for Office.
REM ------------------------------------------------------------------

Set sharename=<SHARED FOLDER>


REM Do not change anything below this line!
REM ------------------------------------------------------------------

SET Proccess=Start

:Header
CLS
ECHO *********************************
ECHO *****   Network Resources   ****
ECHO ******    Version 3.9      ******
ECHO ******   By Nick Thoman    ******
ECHO *********************************
ECHO.
ECHO !!!!!!!! DO NOT CLOSE !!!!!!!!!!
ECHO.
ECHO ___________________________________________________________________________
ECHO.
Goto %Proccess%


:Start
ECHO Removing all Network Devices.
ECHO Please Wait...

for /F "tokens=1-8" %%a in ('net view "\\%Oldsvrname%"') do call :Delete %%a %%b %%c %%d %%e %%f %%g %%h
set test=
Set Proccess=Add_resources
Goto Header

:Add_resources
ECHO Add all network printers.
ECHO Please Wait...

for /F "tokens=1-8" %%a in ('net view "\\%Newsvrname%"') do call :Add %%a %%b %%c %%d %%e %%f %%g %%h
set test=
Set Proccess=Drive
goto Header


:Delete
Set V1=%1
Set V2=%2
Set V3=%3
Set V4=%4
Set V5=%5
Set V6=%6
Set V7=%7
Set V8=%8

If "%V1%"=="Print" (
      Echo Match: %V1%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      Set Printname=%V1% %v2%
      Echo Printer String: "%Printername%"
)

If "%V2%"=="Print" (
      Set Printername=%V1%
      If "%V3%"=="Print" Set Printername=%Printername% %V2%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      If not "%V2%"=="" Set Printername=%V1% %V2%
      Echo Printer String: "%Printername%"
)

If "%V3%"=="Print" (
      Echo Match: %V3%
      If "%V4%"=="Print" Set Printername=%Printername% %V3%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      If not "%V3%"=="" Set Printername=%Printername% %V3%
      Echo Printer String: "%Printername%"
)

If "%V4%"=="Print" (
      Echo Match: %V4%
      If "%V5%"=="Print" Set Printername=%Printername% %V4%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      If not "%V4%"=="" Set Printername=%Printername% %V4%
      Echo Printer String: "%Printername%"
)

If "%V5%"=="Print" (
      Echo Match: %V5%
      If "%V6%"=="Print" Set Printername=%Printername% %V5%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      If not "%V5%"=="" Set Printername=%Printername% %V5%
      Echo Printer String: "%Printername%"
)
If "%V6%"=="Print" (
      Echo Match: %V6%
      If "%V7%"=="Print" Set Printername=%Printername% %V6%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      If not "%V6%"=="" Set Printername=%Printername% %V6%
      Echo Printer String: "%Printername%"
)
If "%V7%"=="Print" (
      Echo Match: %V7%
      If "%V8%"=="Print" Set Printername=%Printername% %V7%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      If not "%V7%"=="" Set Printername=%Printername% %V7%
      Echo Printer String: "%Printername%"
)
If "%V8%"=="Print" (
      Echo Match: %V7%
      Set Proccess=DelPrinter
      Goto Header
) ELSE (
      Echo No printers found on this line.
      Set Proccess=Exit
      Goto Header
)

:DelPrinter
ECHO Removing Printer "\\%Oldsvrname%\%Printername%"

If not "%Printername%"=="" RUNDLL32 PRINTUI.DLL,PrintUIEntry /dn /q /n"\\%Oldsvrname%\%Printername%"
Set Printername=
GOTO EXIT


:ADD
Set V1=%1
Set V2=%2
Set V3=%3
Set V4=%4
Set V5=%5
Set V6=%6
Set V7=%7
Set V8=%8


If "%V1%"=="Print" (
      Echo Match: %V1%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      Set Printname=%V1% %v2%
      Echo Printer String: "%Printername%"
)

If "%V2%"=="Print" (
      Set Printername=%V1%
      If "%V3%"=="Print" Set Printername=%Printername% %V2%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      If not "%V2%"=="" Set Printername=%V1% %V2%
      Echo Printer String: "%Printername%"
)

If "%V3%"=="Print" (
      Echo Match: %V3%
      If "%V4%"=="Print" Set Printername=%Printername% %V3%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      If not "%V3%"=="" Set Printername=%Printername% %V3%
      Echo Printer String: "%Printername%"
)

If "%V4%"=="Print" (
      Echo Match: %V4%
      If "%V5%"=="Print" Set Printername=%Printername% %V4%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      If not "%V4%"=="" Set Printername=%Printername% %V4%
      Echo Printer String: "%Printername%"
)

If "%V5%"=="Print" (
      Echo Match: %V5%
      If "%V6%"=="Print" Set Printername=%Printername% %V5%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      If not "%V5%"=="" Set Printername=%Printername% %V5%
      Echo Printer String: "%Printername%"
)
If "%V6%"=="Print" (
      Echo Match: %V6%
      If "%V7%"=="Print" Set Printername=%Printername% %V6%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      If not "%V6%"=="" Set Printername=%Printername% %V6%
      Echo Printer String: "%Printername%"
)
If "%V7%"=="Print" (
      Echo Match: %V7%
      If "%V8%"=="Print" Set Printername=%Printername% %V7%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      If not "%V7%"=="" Set Printername=%Printername% %V7%
      Echo Printer String: "%Printername%"
)
If "%V8%"=="Print" (
      Echo Match: %V7%
      Set Proccess=AddPrinter
      Goto Header
) ELSE (
      Echo No printers found on this line.
      Set Proccess=Exit
      Goto Header
)

:AddPrinter
ECHO Adding Printer "\\%Newsvrname%\%Printername%"

If not "%Printername%"=="" RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /q /n"\\%Newsvrname%\%Printername%"
Set Printername=
Set Proccess=EXIT
GOTO Header

:Drive
NET USE Z: /Delete
NET USE Z: \\%Newsvrname%\%sharename%

:Exit



<<<<--------------End Copy------------->>>>>
0
noodleNTAuthor Commented:
Why doesn't this join the 2 strings %Printername% and %Fix% together?

Set Test="%Printername%"
Set Fix=" Print"
Echo Found Posible Printer: %Printername%
If %Test%==%badprinter% (
      ECHO BAD PRINTER NAME
      ECHO Adding: %Fix%
      Set Printername=%Printername% %Fix%
      Echo Fixed Printer "%Printername%"
      Pause
)
0
oBdACommented:
It does. Try this:

Echo Found Posible Printer: %Printername%
If %Test%==%badprinter% (
    ECHO BAD PRINTER NAME
    ECHO Adding: %Fix%
    Set Printername=%Printername% %Fix%
)
Echo Fixed Printer "%Printername%"
Pause

The variables in your "if" construction get expanded one time when the line is read, so the Printername in the "echo" line is still the old one.
Enter "help set" for a complete explanation of what happens.
BTW: The "Print" in the share name should be fixed at http:Q_20763519.html.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
noodleNTAuthor Commented:
I thought it might be that. Thanks again!! I guess you can get these points too!

As for that "Print" thing... Turns out they are the same case as the Net view so that wont work... BUT great I dea!.

Thanks again for help everyone! Hope this comes in handy for you guys as it will me!
0
oBdACommented:
As stated in the other thread, the "Print" thing will work if you recreate the share (preferrably when nobody's using it ...) with the exact same name, only the "Print" in a different case. It won't matter for the clients using the share since Windows shares aren't case sensitive, but the script will thus be able to tell the printer share name apart from the share type name.
0
noodleNTAuthor Commented:
Good point.

Considering we are moving everyone to a new File and Print server, Hence the script, just adding that if statement will do the trick. The new printer shares follow a new naming scheme that wont have this problem.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft DOS

From novice to tech pro — start learning today.