Print Server using Windows Server Core


Many administrators are always looking for ways to simplify the required management of their environments, save on overhead, resources, etc. With the advent of Windows PowerShell and it growing to be a commonplace administrator utility in Windows environments, simple systems such as print servers no longer really require a full-fledged graphical user interface. Print servers are prime candidates to be hosted on the CLI-based Windows Server Core variant of Windows Server, especially where they are so easily managed through remote PowerShell. In this brief article, we’ll take a quick look at spinning up a core print server and some of the options available for administering the new server.

Spinning up your machine

Whether you are using traditional hardware for your server (a rackmount server, blade server,tower server/desktop PC) or a virtualized environment, you’ll first need to actually install Windows Server Core on your machine. For my environment, I spun up a virtual machine in my Proxmox virtual environment, but many may be using VMware, Hyper-V, or other solutions which will work perfectly fine.

Adding the features and roles to the server

Once you have Windows installed and your requisite network and domain configuration done, add the necessary services and features to the server:

Install-WindowsFeature Print-Services

This will install the Print Services role as well as the Print Server Role Service. No further configuration is necessary as far as the services and features go. All that is left to do is add some printers!

Administering the server

There are multiple ways to administer your new Windows Core print server.


Arguably the correct way to manage a Windows Core server, is PowerShell. Like other deployments, a print server is managable through the command line with general ease. Beginning with Server 2012’s Core version, there are many print management commands available to administrators.

As an example, we can configure a printer using just two commands:

Adding the printer port: Add-PrinterPort -Name "" -PrinterHostAddress ""

Adding, sharing, and publishing the printer: Add-Printer -Name YourPrinter01 -DriverName "HP Universal Print Driver PCL6" -PortName -Shared -ShareName "YourPrinter01" -Published


An archaic option also exists. At C:\Windows\System32\Printing_Admin_Scripts you’ll find a variety of VBS scripts that can be used to administer the print server. But seriously, who is preferring VBS when we have PowerShell?

As an example, we can configure a printer using the following commands:

Creating the printer port: cscript prnport.vbs -a -r -h -o raw

Adding a printer on the above printer port: cscript prnmngr.vbs -a -p YourPrinter01 -m "HP Universal Print Driver PCL6" -r

Sharing the above printer: cscript prncnfg.vbs -t -p YourPrinter01 -r -h YourPrinter01 +shared -direct -m "Default printer for HR" -l "YourDesiredLocation"

Publishing the printer to Active Directory: cscript pubprn.vbs \\printserver\YourPrinter01 "LDAP://CN=YourContainer,DC=YourDomain,DC=com"


If you really just can’t let go of using the graphical user interface just yet as you ease into command-line-based administration you can still get your hands on the GUI by executing: C:\Windows\System32\printui.exe /il

Additionally, on a remote machine, you can connect RSAT to your Windows Core print server and use the Print Management snap-in for the Microsoft Management Console to visually administer the print server.

But seriously…get comfortable with PowerShell. This is the way.


And, well, that’s pretty much it. There is certainly a more granular level of detail we could go into, but for the purposes of a general overview, I think that does it. Windows Core servers are quick and easy to spin up and an absolute breeze to configure if you are comfortable with PowerShell. In a lab environment, they can also be a great way to get more comfortable with PowerShell if you are just learning. Go ahead and spin up a Windows Core server in VirtualBox or your choice of virtualization bench and give it a try!

What are you using core servers for in your environment, and how do you like it? I’d love to hear from you in the comments below.

Additional Reading

Install Print and Document Services | Microsoft Docs

Using Server Core as a Print Server – Microsoft Tech Community

Joining a Windows 10 Device to the Domain (Updated for Windows 10 Update 20H2)


Up until Windows 10 Update 20H2, many people joined workstations and servers to their domain environment using methods such as accessing the Run Prompt and entering “control system” to access the System Information portion of Control Panel, then clicking the option to modify the name of the device (the resulting window gave you the option to join a domain). Or by visiting the Control Panel and navigating to: System and Security > System > Computer name,domain, and workgroup settings > Change Settings.

With the introduction of Update 20H2, Microsoft has altered this option. In Step 2 shown in the above screenshot, Windows administrators would usually expect the System Properties window to appear, where one could click “Change…” to change either the name of the computer or the domain/workgroup to which the workstation was joined. With Update 20H2, Step 2 of the above screenshot now opens to the Windows 10 Settings App, which many administrators have been reluctant to accept, as the Windows Properties window had previously remained largely unchanged since Windows 95.

While this isn’t a new method of joining a machine to the domain, it was often ignored since many administrators preferred the traditional method discussed in the first paragraph of this post, or primarily administer their domain via PowerShell. This brief article will walk through some options for joining a traditional local Active Directory domain, especially if you really just have to have that System Properties window.

All the methods outlined below assume the device is already connected to the domain’s network and has the appropriate network configuration.

Joining the Domain – Run Prompt

Strike together the Windows + R combination on the keyboard, or right-click the Start Menu icon and select “Run” to open the Run Prompt.

Type: sysdm.cpl and strike the Enter/Return key on the keyboard or click OK.

In the resulting System Properties window, click Change…

In the resulting Computer Name/Domain Changes window, select the radio button called “Domain:” and enter the domain you wish to join (example: When done, click OK.

You may be prompted for credentials; in order to join the domain, you’ll need the credentials of a domain user account which has permissions to join devices to the domain. A domain administrator account is typically used for this function.

After entering the requisite credentials, the device will prompt you to reboot. After rebooting, the device will have been joined to the domain.

Joining the Domain – PowerShell

We can also join a machine to a local domain via a Windows PowerShell command. If you’re like me and prefer to do most of your Windows administrator via the command line, this option is for you.

Launch PowerShell (running as administrator) and type the below command:

Add-Computer -DomainName "" -Restart

You may be prompted for credentials; in order to join the domain, you’ll need the credentials of a domain user account which has permissions to join devices to the domain. A domain administrator account is typically used for this function.

After entering the requisite credentials, the device will reboot. After rebooting, the device will have been joined to the domain. Easy-peasy, and works as quickly as your can type assuming no network issues.

Joining the Domain – Win10 Settings App

Last–and least–is the Windows 10 Settings App. I just…do we have to? We should at least talk about it. Alright.

On the keyboard, press together the Windows+i combination to open the Windows 10 Settings app. Alternatively, you can right-click the Start Menu icon and select Settings.

In the resulting Settings window, click into the Accounts module.

In the resulting page, use the navigation pane at the left of the window to select the “Access work or school” option. Then, click Connect.

Once you’ve clicked Connect, you’ll have a Microsoft Account window appear. Near the bottom of the window, click the “Join this device to a local Active Directory domain” option. Of course, if you’re using Azure Active Directory (AAD), then you can of course use that option.

In the resulting Join a Domain window, input the domain you wish to join, then click Next.

Once you click Next, you’ll be prompted for the requisite domain administrator credentials, after which the computer will prompt you to reboot. Once reboot is complete, the device will then be joined to the domain.


While Windows 10 Update 20H2 removed what some people thought of as the most traditional way of joining a machine to the domain (via the control panel and system information window), there are still a host of other options available. My personal preference for a one-off quick-join remains the sysdm.cpl method via the Run Prompt for its ease of use, the fact that it has remained the same throughout windows versions even through the 20H2 update, and the face that it maintains the graphical user interface with which many folks are already familiar.

The Windows 10 Settings app method isn’t necessarily horrible, but it’s more navigation and more clicks to accomplish the same thing, hence why I feel so many Windows administrators dislike the approach. To Microsoft’s credit, it does make some sense given their Azure Active Directory offering and their push to get customers to the cloud. In previous Windows 10 update releases, I feel the software giant is pushing its customers more and more toward Azure and the cloud with various included products like synced Edge bookmarks, OneDrive, OneNote, etc. What do you think of the smaller administrative changes that Microsoft is making to Windows 10? I’d love to hear from you in the comments below.

Additional Reading

Join a Computer to a Domain | Microsoft Docs

PowerShell to join the computer to domain – Just Do Cloud

Keeping your software up-to-date the easy way

Get rid of annoying “update available” notification and pop-ups by having your computer take care of application updates automatically.


Don’t you love those pop-ups you get in the corner of your desktop telling you there’s an update for a program installed on your computer? Or how about when you open a program and it tells you there’s an update? You just want to use your software, so if you’re like me, you’ve probably clicked “ignore” or closed the update to just get to what you were doing. But there is a better way! Nobody wants to take the time to keep all of their software up-to-date. In this brief blog post, I take a look at how you can make this happen “auto-magically,” at least for many common programs.

Installing Chocolatey package manager

The first thing we will need to do is install the Chocolatey package manager. This is going to let us have access to one central source for the programs and their updates.

To install Chocolatey, open Windows PowerShell by going to the Start Menu and typing “powershell” (quotes ommitted). Right-click the top result, and click “Run as Administrator.” This will require you to have administrative rights. If you do not have administrative rights, this process will not be possible.

In the Windows PowerShell window that appears, paste the following command:

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(''))

Once that command has completed, close Windows PowerShell and launch it again with administrative rights like we just did.

Installing packages

Now we need to install the packages that we want to keep up-to-date. To find out if a program you have has a package available, use the below example in PowerShell:

choco search programname

where programname is the name of the program you want. Some examples might be:

  • adobereader
  • adobe-connect
  • googlechrome
  • microsoft-edge
  • discord
  • putty
  • icue
  • bitwarden
  • lastpass
  • obs-studio
  • conemu
  • forticlientvpn
  • openvpn
  • java
  • jre
  • logitech-options
  • reflect-free
  • and many, many more.

To actually install any or a combination of these, use the following command:

cinst programname -Y

where programname is the package name. You can list multiple package names in succession to install multiple programs at once:

cinst programname1 programname2 programname3 -Y

Chocolatey will download the packages and install them.

Writing the update script

With the packages installed, now we need to create a super simple script that will update those packages.

Open Notepad by going to the Start Menu and typing “notepad” (quotations omitted) and running the top result.

In the blank document that opens, type the following:

choco upgrade all -Y

If you continually run into errors with certain packages updating and don’t mind the insecurity of it, you can also use:

choco upgrade all -Y --ignore-checksums

though I don’t recommend it.

Now save this by going to File > Save As… In the Save As window, change the drop-down menu for the file type. It will be defaulted to .txt and we want to change it to All Files. Type a name for the file ending with .ps1. Example:


Save it to a location where it won’t be touched and will always be available. I have mine saved to a folder I created at C:\ScheduledTasks but you can put yours wherever you want.

Scheduling automatic updates

Finally, now that we have installed packages and created a script to update them, we will want to schedule the update process to be completely automatic. Because being hands-off is the whole point!

Open the Task Scheduler by clicking the Start Menu and typing “task scheduler” then running the top result.

In the resulting Task Scheduler window, open the Action menu, then click Create Task.

Give your scheduled task a name and a description, then select “Run whether user is logged in or not” and check “Run with highest privileges.” Finally, Configure for: Windows 10.

Move to the Triggers tab.

Add a new trigger to begin the task on a schedule. Input your desired start date, reoccurence period, and ensure “Enabled” is checked, then click OK.

Move to the Actions tab.

Make the action “Start a program” and in the Program/script field, paste the path to PowerShell:


In the Add arguments field, add the following:

-file scriptpath

where scriptpath is the path to where you saved your script earlier. My example looked like this:

-file C:\ScheduledTasks\chocolatey-updates.ps1

When done, click OK on all remaining Task Scheduler windows and the task will be scheduled. Now, as long as your computer is on, you leave the task scheduled, and the script is available where you saved it, your computer should automatically update your specified programs without you having to do anything at all.

I have been keeping my computers up to date like this for several years (set to automatically update everything weekly) and it saves me tons of time, and I rarely get notifications about new versions or annoying popups anymore.

Bringing it all together

In this process, we installed Chocolately package manager, figured out what programs we wanted to keep up to date that were available through Chocolatey, installed those programs, wrote the update script/command, and scheduled PowerShell to run that command at a regular interval.

How did this go for you? Got any other neat tips and tricks for keeping your system running in great shape? I’d love for you to share them in the comments.