Disk Cleanup and the joys of Features-on-demand

Features-on-demand – it’s a great new “feature” – when it works. However, the rest of the time it is a real headache.

A couple of months ago I decided I wanted to trim down the size of my Windows Server 2012 R2 VM’s. Disk Cleanup (cleanmgr.exe) is one tool that I’ve often found really useful to have on a server install, especially when preparing OS VM images to ensure the install is as lean and clean as possible.

However, by default the tool isn’t installed on Windows Server 2012. To get access to Disk Cleanup on a server OS you need to install the Desktop Experience feature:

Install Desktop Experience using Add Roles and Features Wizard

Install Desktop Experience using Add Roles and Features Wizard

Because I had used features-on-demand to remove any disabled packages from the system I received a message telling me I might need to specify an alternate location for the source files:

Specify an Alternate Source path

Specify an Alternate Source path

Anyone who has used features-on-demand should be familiar with this:

Desktop Experience Feature-on-demand removed

Desktop Experience Feature-on-demand removed

Because I haven’t got a GPO restricting my servers from downloading updates and packages from Windows Update I thought I wouldn’t have a problem and didn’t need to specify a source.

I was wrong:

Failed to install the Desktop Exprience

Failed to install the Desktop Experience

That is a bit odd – the server has access to Windows Update – it had downloaded updates earlier that day. Other removed features-on-demand features had been installed on this server without an issue, downloading the source files directly from Windows Update. So I was a little puzzled as to why this was different.

No problem, I thought! All that needs to be done is specify a source. In case this is useful, the following TechNet article covers the different ways of specifying a source when installing features that have been removed:

Configure Features on Demand in Windows Server

There are several different sources that can be provided to the Add Roles and Features Wizard:

  • Specify a WIM file (and index) containing the windows installation files for the OS version that was installed on the server. This is usually a file called install.wim that can be found in the Sources folder of the Windows Server2012R2 installation media.

    Install Feature using a WIM source

    Install Feature using a WIM source

  • Specify the windows folder of a working OS install containing the files for this feature. This is usually done by mapping a drive to a share or by mountingaVHD/VHDx file as a drive to the OS.

    Install Feature using a shared Windows Folder on a machine with the Desktop Experience feature installed

    Install Feature using a shared Windows Folder on a machine with the Desktop Experience feature installed

I tried both of the above methods but neither of them seemed to work for the Desktop Experience feature. The same error occurred every time:

Install-Windowsfeature: The request to add or remove features on the specified server failed.
Installation of one or more roles, role services, or features failed.
The source files could not be downloaded.
Use the "source" option to specify the location of the files that are required to restore the feature. For more
information on specifying a source location, see http://go.microsoft.com/fwlink/?LinkId=243077. Error: 0x800f0906

I also tried installing the feature using PowerShell, using no alternative source, using a WIM source and using a Windows folder source:

Install-WindowsFeature -name Desktop-Experience -IncludeAllSubfeature -Restart -Source z:

But each time I received the same error message:

Install Feature with PowerShell and specifing a valid source - failure.

Install Feature with PowerShell and specifying a valid source – failure.

At this point I had all but given up. Luckily I didn’t. I thought I’d give it one last try – but this time instead of using commands from the PowerShell DISM module I’d use DISM.EXE directly:

DISM /online /enable-feature /featurename:DesktopExperience /all /source:z:\

Success! DISM worked!

DISM for the WIN! Back of the net!

DISM for the WIN! Back of the net!

This screenshot and the one above of the PowerShell install-windowsfeature failing to install the feature are from the same machine with the same source mapped.

Z: drive here was mapped to a share of the c:\windows folder of a server that has the Desktop Experience feature correctly installed.

It looks like DISM may operate in a slightly different way to PowerShell DISM Module and the Add Roles and Features Wizard when it comes to installing features.

So, if Add Roles and Features Wizard and PowerShell Install-WindowsFeature fail, try DISM – it might work!

Additional Notes

I have also run into the same problem when installing the AD DS feature on a different server – so I don’t think this is specific to the machine or the feature. It has also occurred on machines that I want to convert from a core install to a gui install.

I have tried installing the feature on a clean install of the OS and it works fine – but as soon as all the latest windows hotfixes for the OS are installed from Windows Update the feature can no longer be installed (if it has been removed).

From my investigation, many other people have experienced this problem with varying degrees of success in solving it. Some have said that patching the WIM file with all the latest hotfixes worked for them – but it didn’t for me (but it did inspire me to write a PowerShell module to ease the WIM patch process – more on this in another post). I was certainly in the “tearing my hair out” group until I randomly tried this.

Also, I did try DISM without specifying a source as well, and it failed with the same error code as the PowerShell did:

Install Feature using DISM fails with no Source specified.

Install Feature using DISM fails with no Source specified.

At first I actually thought the soution was using DISM with the /LimitAccess switch to prevent DISM from using the internet to download the packages, but after further tests it doesn’t seem to make any difference – DISM works with and without this switch. The equivelent to the /LimitAccess switch also doesn’t appear to be available in the PowerShell Install-WindowsFeature cmdlet.

Tiered Storage Spaces Experiementation with PowerShell

I’ve been recently experiementing with the interesting Tiered Storage Spaces features in Windows Server 2012 R2. As part of this I’ve been going through some of the excellent MSFT File Server team blogs on TechNet.

This one in particular by Jose Barreto was supremely useful and I highly recommend it. It contains some excellent PowerShell code for setting up a VM for experimenting with Tiered Storage Spaces as well as configuring them within the VM.

I did find it the PowerShell code is fragmented throughout the long article and was a little bit hard to use (lots of ALT+TAB, CTRL+C and CTRL+V). So I’ve assembled the code into two code snippets that you should be able to paste into a PowerShell ISE script window and then step through – it should save a lot of repetitive keypressing.

I also modified it slightly to have some of the configuration items, such as where to put the VM HDD and SSD VHDX files in variables at the beginning of the script to make it easier to manage.

This is the script to run on the Host OS that will install Hyper-V, create the VM, create the test VHDXs and start it up:

# --------------------------------------------------------------------------
# Execute on HOST OS
# --------------------------------------------------------------------------
# Configure these paths and names
# Path to store the VM SSDs
$SSD_VHD_Path = "F:\VM\VHD"
# Path to store the VM HDDs
$HDD_VHD_Path = "E:\VM\VHD"
# Name of the VM To create/use
$VMName = 'Windows Server 2012'
# Path to the VM OS disk (if creating a VM).
$VM_OS_Path = "F:\VM\OS\Windows Server 2012.VHDX"
# --------------------------------------------------------------------------

# Preparation steps: Install Window Server 2012 R2 Preview
# Install required roles and features, restart at the end
# If Hyper-V is already installed comment out this line:
Install-WindowsFeature Hyper-V -IncludeManagementTools –Restart

# Create 4 VHDX files on the SSD with 10GB each
1..4 | % { New-VHD -Path "$SSD_VHD_Path\VMA_SSD_$_.VHDX" -Dynamic –Size 10GB}

# Create 8 VHDX files on the HDD with 30GB each
1..8 | % { New-VHD -Path "$HDD_VHD_Path\VMA_HDD_$_.VHDX" -Dynamic –Size 30GB}

# Create a new VM. Assumes you have an Windows Server 2012 R2 OS VHDX in place
# If you already have a VM comment out this line:
New-VM -Name $VMName -Path D:\VMS –VHDPath $VM_OS_Path -Memory 2GB

# Add all data disks to the VM
1..4 | % { Add-VMHardDiskDrive -VMName $VMName -ControllerType SCSI -Path "$SSD_VHD_Path\VMA_SSD_$_.VHDX" }
1..8 | % { Add-VMHardDiskDrive -VMName $VMName -ControllerType SCSI -Path "$HDD_VHD_Path\VMA_HDD_$_.VHDX" }

# Start the VM
Start-VM $VMName
Get-VM $VMName
Get-VM $VMName | Get-VMHardDiskDrive

Once you’ve got your VM up and running you can execute the following script on it to experiement with the actual Tiered Storage Spaces:

# --------------------------------------------------------------------------
# Execute on GUEST OS
# --------------------------------------------------------------------------
Get-PhysicalDisk | Sort Size | FT DeviceId, FriendlyName, CanPool, Size, MediaType -AutoSize
Get-PhysicalDisk -CanPool $true | ? Size -lt 20GB | Sort Size | FT -AutoSize
Get-PhysicalDisk -CanPool $true | ? Size -gt 20GB | Sort Size | FT -AutoSize

$s = Get-StorageSubSystem
New-StoragePool -StorageSubSystemId $s.UniqueId -FriendlyName Pool1 -PhysicalDisks (Get-PhysicalDisk -CanPool $true)

# Configure media type for virtual SAS disks
Get-StoragePool Pool1 | Get-PhysicalDisk | ? Size -lt 20GB | Set-PhysicalDisk –MediaType SSD
Get-StoragePool Pool1 | Get-PhysicalDisk | ? Size -gt 20GB | Set-PhysicalDisk –MediaType HDD
Get-StoragePool Pool1
Get-StoragePool Pool1 | Get-PhysicalDisk | Sort Size | FT –AutoSize
Get-StoragePool Pool1 | Get-PhysicalDisk | Sort Size | FT FriendlyName, Size, MediaType, HealthStatus, OperationalStatus -AutoSize
Get-StoragePool Pool1 | Get-PhysicalDisk | Group MediaType, Size | Sort Name | FT -AutoSize
Get-StoragePool Pool1 | FL Size, AllocatedSize
Get-StoragePool Pool1 | New-StorageTier –FriendlyName SSDTier –MediaType SSD
Get-StoragePool Pool1 | New-StorageTier –FriendlyName HDDTier –MediaType HDD
Get-StorageTier | FT FriendlyName, MediaType, Size -AutoSize
Get-StoragePool Pool1 | FL Size, AllocatedSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Simple | FT -AutoSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Mirror | FT -AutoSize
Get-StorageTierSupportedSize HDDTier -ResiliencySettingName Simple | FT -AutoSize
Get-StorageTierSupportedSize HDDTier -ResiliencySettingName Mirror | FT -AutoSize

# Configure resiliency settings
Get-StoragePool Pool1 | Set-ResiliencySetting -Name Simple -NumberOfColumnsDefault 4
Get-StoragePool Pool1 | Set-ResiliencySetting -Name Mirror -NumberOfColumnsDefault 2

# Create simple and mirrored spaces with tiering
$SSD = Get-StorageTier -FriendlyName SSDTier
$HDD = Get-StorageTier -FriendlyName HDDTier
Get-StoragePool Pool1 | New-VirtualDisk -FriendlyName Space1 -ResiliencySettingName Simple –StorageTiers $SSD, $HDD -StorageTierSizes 8GB, 32GB -WriteCacheSize 1GB
Get-StoragePool Pool1 | New-VirtualDisk -FriendlyName Space2 -ResiliencySettingName Mirror -StorageTiers $SSD, $HDD -StorageTierSizes 8GB, 32GB –WriteCacheSize 1GB
Get-StoragePool Pool1 | Get-ResiliencySetting | FT -AutoSize
Get-VirtualDisk | FT -AutoSize
Get-StorageTier | FT FriendlyName, MediaType, Size -AutoSize
Get-StoragePool Pool1 | FL Size, AllocatedSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Simple | FT -AutoSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Mirror | FT -AutoSize
Get-StorageTierSupportedSize HDDTier -ResiliencySettingName Simple | FT -AutoSize
Get-StorageTierSupportedSize HDDTier -ResiliencySettingName Mirror | FT -AutoSize

# Configure volume “F” on Space1
Get-VirtualDisk Space1 | Get-Disk | Set-Disk -IsReadOnly 0
Get-VirtualDisk Space1 | Get-Disk | Set-Disk -IsOffline 0
Get-VirtualDisk Space1 | Get-Disk | Initialize-Disk -PartitionStyle GPT
Get-VirtualDisk Space1 | Get-Disk | New-Partition -DriveLetter “F” -UseMaximumSize
Initialize-Volume -DriveLetter “F” -FileSystem NTFS -Confirm:$false

# Configure volume “G” on Space2
Get-VirtualDisk Space2 | Get-Disk | Set-Disk -IsReadOnly 0
Get-VirtualDisk Space2 | Get-Disk | Set-Disk -IsOffline 0
Get-VirtualDisk Space2 | Get-Disk | Initialize-Disk -PartitionStyle GPT
Get-VirtualDisk Space2 | Get-Disk | New-Partition -DriveLetter “G” -UseMaximumSize
Initialize-Volume -DriveLetter “G” -FileSystem NTFS -Confirm:$false
Get-Partition | ? DriveLetter -ge "F" | FT -AutoSize
Get-Volume | ? DriveLetter -ge "F" | FT -AutoSize

# Create 3 files on volume “F”, place them on different tiers
1..3 | % {
fsutil file createnew f:\file$_.dat (4GB)
fsutil file setvaliddata f:\file$_.dat (4GB)
}
Set-FileStorageTier -FilePath f:\file1.dat -DesiredStorageTierFriendlyName Space1_SSDTier
Set-FileStorageTier -FilePath f:\file2.dat -DesiredStorageTierFriendlyName Space1_HDDTier
Get-FileStorageTier -VolumeDriveLetter F

# Create 3 files on volume “G”, place them on different tiers
1..3 | % {
fsutil file createnew g:\file$_.dat (4GB)
fsutil file setvaliddata g:\file$_.dat (4GB)
}
Set-FileStorageTier -FilePath g:\file1.dat -DesiredStorageTierFriendlyName Space2_SSDTier
Set-FileStorageTier -FilePath g:\file2.dat -DesiredStorageTierFriendlyName Space2_HDDTier
Get-FileStorageTier -VolumeDriveLetter G
Dir F:
Dir G:
Get-Volume | ? DriveLetter -ge "F" | FT -AutoSize
Get-FileStorageTier -VolumeDriveLetter F | FT -AutoSize
Get-FileStorageTier -VolumeDriveLetter G | FT -AutoSize

# Check tasks used by Storage Tiering
Get-ScheduledTask -TaskName *Tier* | FT –AutoSize
Get-ScheduledTask -TaskName *Tier* | Get-ScheduledTaskInfo

# Manually running the “Storage Tiers Optimization” task
Get-ScheduledTask -TaskName "Storage Tiers Optimization" | Start-ScheduledTask
Get-ScheduledTask -TaskName *Tier* | FT –AutoSize
Get-ScheduledTask -TaskName *Tier* | Get-ScheduledTaskInfo
Get-ScheduledTask -TaskName "Storage Tiers Optimization" | Start-ScheduledTask
Get-ScheduledTask -TaskName "Storage Tiers Optimization" | Get-ScheduledTaskInfo

# These commands assume that the SQLIO2.EXE file was copied to the C:\SQLIO folder
# SQLIO workload 1 : 30 seconds, random, read, 8KB, 4 thread, 16 outstanding IOs, no buffering
# SQLIO workload 2 : 30 seconds, sequential, read, 512KB, 4 thread, 4 outstanding IOs, no buffering
# SQLIO can be found here: blogs.technet.com/b/josebda/archive/2013/03/25/sqlio-powershell-and-storage-performance-measuring-iops-throughput-and-latency-for-both-local-disks-and-smb-file-shares.aspx

# Check file location on tiers for volume F:
Get-FileStorageTier -VolumeDriveLetter F | FT -AutoSize

# Running SQLIO on F:, using File1 (HDD tier), File2 (HDD tier) and File 3 (unspecified tier)
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN f:\file1.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN f:\file2.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN f:\file3.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN f:\file1.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN f:\file2.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN f:\file3.dat

# Check file location on tiers for volume G:
Get-FileStorageTier -VolumeDriveLetter G | FT -AutoSize

# Running SQLIO on G:, using File1 (HDD tier), File2 (HDD tier) and File 3 (unspecified tier)
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN g:\file1.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN g:\file2.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN g:\file3.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN g:\file1.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN g:\file2.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN g:\file3.dat

Get-FileStorageTier -VolumeDriveLetter F | FT -AutoSize
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN f:\file1.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN f:\file2.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN f:\file3.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN f:\file1.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN f:\file2.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN f:\file3.dat
Get-FileStorageTier -VolumeDriveLetter G | FT -AutoSize
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN g:\file1.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN g:\file2.dat
c:\sqlio\sqlio2.exe -s30 -frandom -kR -b8 -t4 -o16 -BN g:\file3.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN g:\file1.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN g:\file2.dat
c:\sqlio\sqlio2.exe -s30 -fsequential -kR -b512 -t4 -o4 -BN g:\file3.dat

# Check state before change
Get-VirtualDisk Space1 | FT -AutoSize
Get-StorageTier Space1* | FT FriendlyName, Size –AutoSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Simple | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | FT –AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | Get-Volume | FT –AutoSize

# Add 4GB on the SSD Tier
Resize-StorageTier Space1_SSDTier -Size 12GB
Get-VirtualDisk Space1 | Get-Disk | Update-Disk

# Check after Virtual Disk change
Get-VirtualDisk Space1 | FT -AutoSize
Get-StorageTier Space1* | FT FriendlyName, Size –AutoSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Simple | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | FT –AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | Get-Volume | FT –AutoSize

# Extend partition (also extends the volume)
Resize-Partition -DriveLetter F -Size 43.87GB

# Check after Partition/Volume change
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | FT –AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | Get-Volume | FT –AutoSize
Get-VirtualDisk Space1 | FT -AutoSize
Get-StorageTier Space1* | FT FriendlyName, Size –AutoSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Simple | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | Get-Volume | FT -AutoSize
Resize-StorageTier Space1_SSDTier -Size 12GB
Get-VirtualDisk Space1 | Get-Disk | Update-Disk
Get-VirtualDisk Space1 | FT -AutoSize
Get-StorageTier Space1* | FT FriendlyName, Size –AutoSize
Get-StorageTierSupportedSize SSDTier -ResiliencySettingName Simple | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | FT -AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | FT –AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | Get-Volume | FT –AutoSize
Resize-Partition -DriveLetter F -Size 43.87GB
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | FT –AutoSize
Get-VirtualDisk Space1 | Get-Disk | Get-Partition | Get-Volume | FT –AutoSize

Hopefully this saves someone out there a little time copying and pasting!

Cleaning Up Windows SxS Folder in Preparation for Imaging

In preparation for releasing an operating system image to be used as a WM template I usually like to perform some “shrinking commands” to make sure the image has as small a foot-print as possible.

All the “shrinking commands” are all command line or PowerShell based because they must also be able to be performed on a Windows Server Core installation.

Remove all Uninstalled Feature Binaries

The first thing I usually do is remove any uninstalled feature binaries (as part of Windows Features on Demand). I’ve covered this in an earlier article here.

Remove Old Service Pack Backup Files

The following command removes any files that were backed up as part of installing a service pack. If you execute this command you won’t be able to uninstall any service packs.

DISM /online /cleanup-image /SPSuperseded
DISM /online /cleanup-image /SPSuperseded

DISM /online /cleanup-image /SPSuperseded

Remove Superceeded Components

This command removes any components in the Windows SxS folder that have been superceeded by newer versions.

Windows Server 2008/2008 R2/2012 and Windows 7/8:

DISM /online /cleanup-image /StartComponentCleanup

Windows Server 2012 R2 and Windows 8.1 (performs some additional optimization):

DISM /online /cleanup-image /StartComponentCleanup /ResetBase
DISM /online /cleanup-image /StartComponentCleanup /ResetBase

DISM /online /cleanup-image /StartComponentCleanup /ResetBase

Remove all Uninstalled Feature Binaries

I’m still getting my head around this whole blog thing, but I’m going to write a quick article about trimming down a Windows Server 2012 install while I wait for my partner to recover from a small bout of vertigo.

The “Features on Demand” feature of Windows Server 2012 is really great at trimming down a Windows Server 2012 installation.

To use the “Features on Demand” you need to “remove” the binaries required by any features that aren’t currently installed by your OS. You can remove them one by one, but this is a real drag.

The following command will remove the binaries for any non-installed features on your system:

get-windowsfeature | where-object -FilterScript { $_.InstallState -eq 'Available' } | remove-windowsfeature -remove
Features on Demand Removal Progress

Features on Demand Removal Progress

Features on Demand Removal Complete

Features on Demand Removal Complete

After you’ve run this command you’ll need to have your windows install source available if you want to install any additional features. You might also need to specify an alternate source location when installing any future features. For more information on installing windows features from an alternate source, see this article on TechNet:

Install or Uninstall Roles, Role Services, or Features

I usually like to run this command when I’m preparing a new VM template after I’ve installed all the features I think will be needed for this VM. This results in a smaller deployment footprint.

Installing Windows Server 2012 R2 Core – Additional Tools and Scripts

Although Windows Server Core is a great way of ending up with a slim and trim diet server, it can be a little bit tricky when first getting started configuring it. During my experiments running Server Core VM’s I found that there were a few tools either built into server core or available separately that can help get over this configuration “hump”.

Built-in Tools

  1. SConfig.exe

    SConfig.exe is a built in command line tool (with a simple command line GUI) that allows you to perform some simple configuration tasks on your core installation.

    SConfig.exe

    SConfig.exe

    Some of the functions include:

    1. Renaming the computer
    2. Joining a domain or workgroup
    3. Enabling remote management (Win-RM)
    4. Enabling remote desktop
    5. Installing windows updates
    6. Configure network settings
    7. Change system date/time
    8. Shutdown/reboot server

Other Tools

When installing a new copy of one of the Windows Server Core versions it’s quite useful to install several additional tools that will help manage the server from a command prompt and/or PowerShell console.

  1. Corefig for Windows Server 2012 Core and Hyper-V Server 2012

    Corefig allows you to configure some of the main settings of a Windows Server Core installation as well as installing updates and windows features and roles.

    Corefig PowerShell Application

    Corefig PowerShell Application

  2. Windows Update PowerShell Module

    The Windows Update PowerShell module allows you to install windows updates from a PowerShell command line by executing (after installing the module onto the server):

    Get-WUInstall
  3. Remote Server Administration Tools PowerShell module

    The Remote Server Administration Tools PowerShell module is available as an installable feature on Windows Server Core edition. It needs to be first installed by executing the following command at a PowerShell prompt:

    Add-WindowsFeature -Name 'RSAT-AD-PowerShell' -IncludeAllSubFeature
  4. PowerShell Community Extensions

    The PowerShell Community Extensions project provides various useful PowerShell cmdlets. I always install this onto the server and copy the entire PSCX modules folder:

    c:\Program Files (x86)\PowerShell Community Extensions\Pscx3\

    folder into the system modules folder:

    c:\Program Files\WindowsPowerShell\Modules

    This makes the PSCX module available by the import-module command in PowerShell.