If you’ve ever tried installing a printer on Server Core 2008, chances are you’ve probably come across an error when using Print Management (printmanagement.msc) to remotely manage your Server Core install and add your printer. It looks like it’s going to work fine, but then just before it finishes, you get this…
Unable to install <printer name>, Type 3 – User Mode, <architecture> driver. Operation could not be completed (error 0x800f0247).
And then you might also get this…
Failed to add driver. Operation could not be completed (error 0x00000578).
When you try installing this same printer and driver on a GUI machine, it installs without any problems, so you can safely say it’s a Server Core issue.
As you’d expect, the first step would be to lookup the error code… So we have errors 0x800f0247 and 0x00000578.
Converting these codes from hexidecimal to decimal gives us errors 2148467271 and 1400 respectively. The first one is bogus, as it’s out of range, however error code 1400 translates as ERROR_INVALID_WINDOW_HANDLE.
The issue is the fact that Server Core isn’t handling the unsigned drivers by giving the Print Management console information to prompt the user to confirm the installation of the driver, hence the driver fails to install.
To get around this issue, we can pre-install the required drivers from the command line of the Server Core machine, by passing a call to the PrintUI.dll (which luckily is still used for the Server Core printing engine) – You could also theoretically use the prndrvr.vbs file which can be found in %SYSTEMROOT%\System32\Printing_Admin_Scripts\en-us however it seems that it also cannot handle the prompting of the unsigned driver installation either, and because it only passes calls through to PrintUI.dll anyway, we may as well use it directly.
So create a directory called C:\Temp and copy your printer driver folder to this location on your Server Core machine.
Then, from the command prompt of your Server Core machine, use the following syntax…
start /w rundll32 PrintUI.dll,PrintUIEntry /ia /K /m “<driver name>” /h “<architecture>” /v 3 /f “<driver inf file>”
Here is a breakdown of the above command…
- The start /w command will hold the command prompt until the command has finished;
- rundll32 is the process we use to invoke PrintUI.dll;
- ,PrintUIEntry tells rundll32 that we want to use this entry point in PrintUI.dll;
- /ia tells the PrintUI.dll that we want to install a printer driver using an inf file;
- /K (must be capital!) allows us to specificy a numerical value for /v;
- /m is where you provide the name of the driver (in my case “Samsung CLX-3160 Series”) – You can get this by looking inside the inf file for your driver;
- /h is where you provide the architecture for the driver, as “Windows NT x86” for 32-bit architecture, “x64” for 64-bit architecture and “IA64” for Itanium architecture;
- /v specifies that the driver is used for Windows XP or later
- /f is the location to the driver .inf file (which you should have copied to C:\Temp)
So for example, my command looked like this…
start /w rundll32 PrintUI.dll,PrintUIEntry /ia /K /m “Samsung CLX-3160 Series” /h “Windows NT x86” /v 3 /f “C:\Temp\Samsung CLX-3160 Series\driver\sugi1.inf”
After running this command, you get a red unsigned driver warning screen, which you can now accept to install the driver.
When you refresh the Drivers node in Print Management on your GUI machine, you’ll see your new driver listed. You can now go ahead and deploy your printer, however note that if you are running x64 of Server Core 2008 you’ll need to install the x64 driver before you can add the printer (otherwise you won’t be able to select your installed driver during the printer add process).
You can also delete the folders you copied in to C:\Temp now, because the drivers have been copied to their permanent location.
11 thoughts on “Error Installing Printers on Windows Server Core 2008”
Thank you! I was just about ready to build a 32-bit Server 2008 installation just to pull out a single 32-bit driver from it, as the printer manufacturer only had unsigned drivers on their website while Server 2008 had built-in signed drivers.
Additionally, turns out you can specify just the /id switch instead of all of the other switches for printui.dll to bring up the add driver dialog prompts.
start /w rundll32 printui.dll,PrintUIEntry /id
I could not for the life of me get the command-line-specified method to work for that driver set, but it took it just fine via the dialog prompts. I must have had an extra space or typo in the driver name.
Glad you got it working, Jason!
That’s an awesome tip about the /id switch; thanks for posting. I think the problem with the command-line example I posted is that the inverted commas don’t copy across as the same character when pasting in the DOS prompt. They look identical, but are different characters. I should probably fix that up. 🙂
Thanks Mat great stuff,
I ‘ve been struggling a bit with Kyocera Universal drivers. Your solution worked for me on Windows 2008 R2 x64 Core edition.
Hi Mat, have a question for you: is it possible to do the same for a Failover Cluster Print Server?
I answer myself:
/c \remotemachine (where remotemachine is the clustered printer server name)
Thanks Mat! I had problems adding a HP T1120ps 64bit driver on my core R2 server. This solved it! If only I’d found your post before wasting hours on it. haha!
start /w rundll32 printui.dll,PrintUIEntry /id
Worked, thank you both.
For our cluster print server using /id switch failed with error code 0x800F023F. The way around this was to simply type the full command as posted by Mat. It worked like a charm.
Thank you for posting this solution. It was a real life saver..!
I’ve been surfing online more than three hours today, yet I never found any interesting article like yours. It is pretty worth enough for me. In my view, if all
Very cool…worked like a charm!
This information helps me alot. thanks