Increase the Speed of PXE Boot/TFTP When Using SCCM Distribution Point

If you’re looking to improve the performance (quite significantly in my experience) of Trivial File Transfer Protocol/TFTP (in other words to improve the download speed of your SCCM boot images to your clients from the DP) you can add some registry keys on the server hosting the PXE-enabled Distribution Point to achieve this.

The two keys required (and the values I suggest using) are:

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\SMS\DP" -Name RamDiskTFTPBlockSize -PropertyType DWord -Value "16384"
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\SMS\DP" -Name RamDiskTFTPWindowSize -PropertyType DWord -Value "8"

Once the keys have been added, restart the “Windows Deployment Service Server” service and that’s you finished. 🙂

One caveat with this change is that it can also adversely affect performance and in some cases even break PXE altogether (as I found out with my Hyper-V 2012 R2 VM’s – VM’s stopped working completely while physical hardware zipped along like shit off a stick) so some tweaking of the values may be required depending on your environment. Basically one size does not fit all with this change.

Can’t find any proper information on SCCM CB but it looks like this is a supported change from looking at this TechNet post: link

UPDATE 30/09/2016 – some much better detail and testing results for this TFTP optimisation provided by Jörgen Nilsson on the excellent website – link

/ JC

Posted in SCCM 2012 R2, SCCM Current Branch | Tagged , , , | 4 Comments

Quickly Determine all Local Drive Letters on a Device From Command Line

To quickly see which drive letters/volumes are available from a command prompt you can use wmic to get a quick summary.

The following command will give you the information you need:

wmic logicaldisk get description,name

/ JC

Posted in Uncategorized | Leave a comment

Further simplifying servicing models for Windows 7 and Windows 8.1

Microsoft look to be moving to a cumulative approach to updates with Windows 7 and 8.1 which seems to be similar to what they have already done for Windows 10.

Single Cumulative Updates instead of multiple individual patches moving forward. Better late than never I guess… 😉

See the full blog post on TechNet:

/ JC

Posted in Uncategorized | Leave a comment

Windows 10 Language Packs are Release Specific

Just a heads up – after wasting the best part of a day trying to figure out what was wrong it turns out that Language Packs for Windows 10 are release specific and only seem to work with the corresponding release of Windows.

What this means is that Language Packs for Windows 10 1511 won’t install offline via MDT when creating a reference image using 1607 Windows 10 media.

1511 Language Packs only work with 1511 media and NOT 1607 media.


Need to wait for 1607 Language Packs to be released then eh… 😉

/ JC

Posted in Uncategorized | Leave a comment

Run PowerShell Scripts as Windows Scheduled Tasks

It can be useful to have a PowerShell script which runs as a Windows Scheduled task to perform otherwise manual tasks. Being a lazy bugger I like to automate as many boring, shitty tasks as I can so PowerShell and Scheduled Tasks are my friends…

A good example of this would be if you needed to run a cleanup of WSUS to remove declined, superseded, expired updates etc.

The script I want to run looks like the following:

       Cleans up WSUS on local server
       PowerShell.exe -ExecutionPolicy ByPass -File WSUSCleanup.ps1
       Author:	Jonathan Conway
       Created:	21/07/2016
       Version:	1.1

# Set WSUS port number (standard is 8530 on Windows Server 2012 R2 but can be customised)
$WSUSPortNumber = 8530

# Connect to local server using PowerShell
Get-WsusServer -Name $env:computername -PortNumber $WSUSPortNumber

# Perform required cleanup commands
Get-WsusServer | Invoke-WsusServerCleanup -CleanupObsoleteUpdates -CleanupUnneededContentFiles -CompressUpdates -DeclineExpiredUpdates -DeclineSupersededUpdates | `
Out-File -FilePath C:\Tools\Scripts\wsuscleanup.log

In order to run this as a Scheduled Task in Windows I’d need to run it as SYSTEM (NT AUTHORITY\SYSTEM) – change the “Configure for:” section at the bottom to match the OS you’re using as well, for compatibility purposes.

Configure a Trigger – once a week should be more than enough for this particular task.

The action should be configured to “Start a Program” which would be as per the command line example below (example assumes you have a script called WSUSCleanup.ps1 located in a folder called “C:\Tools\Scripts”):

PowerShell.exe -ExecutionPolicy ByPass -File C:\Tools\Scripts\WSUSCleanup.ps1

It should end up looking a bit like this:


And that’s about it – should run as per the Trigger Schedule.

/ JC

Posted in PowerShell | Leave a comment

How To Deploy & Run PowerShell Scripts via SCCM CB

A customer recently had a requirement to deploy a PowerShell script to configure a setting for App-V 5.0.

Normally I’d do this with a Batch file called “Configure.cmd” containing the code displayed below. This works for the majority of tasks:

@echo off
PUSHD %~dp0

PowerShell.exe -ExecutionPolicy Bypass -File ".\PowerShellScriptFileName.ps1"


As usual, I tested the deployment before adding into SCCM by using psexec running under the System context (i.e. the same context that SCCM deployments run under) with the command below. One the command prompt is open you can run the required installer as the System context:

psexec /s cmd.exe

This completed successfully and made the configurations that I’d wanted. Bosh. Bloody awesome I thought…

On this occasion however I needed to reconfigure a 32-bit application (App-V 5.0) on a 64-bit operating system (Windows 7 x64).

This doesn’t play well when deployed via SCCM is seems and ends up running using the SysWOW64 redirection – the result in my case was that registry changes were made by the PowerShell cmdlet in the Wow6432Node area of the registry.

In order to get around this I discovered a new concept to me called “Sysnative” which is a virtual directory and special alias that can be used by applications/scripts to access the 64-bit “System32” folder – which is exactly what I wanted to happen in this instance for my script to produce the required result.

Therefore to use this you need to change the location that PowerShell is called from to %WinDir%\Sysnative (you can’t see it in Windows Explorer btw – but trust me, this little bugger does indeed exist):

@echo off
PUSHD %~dp0

%WinDir%\Sysnative\windowsPowershell\v1.0\Powershell.exe -ExecutionPolicy Bypass -File ".\PowerShellScriptFileName.ps1"


Once changed to reference the correct PowerShell.exe my script punted out the desired results. Fucking Magic 🙂

/ JC

Posted in Batch File, PowerShell, SCCM Current Branch | 1 Comment

RoboCopy a Single File to See Accurate Progress/Time Estimates

RoboCopy is used as a tool to copy folders but it can also be used to copy single files if required.

This is handy if you’re copying a large file (such as an ISO or WIM image) and want some sort of feedback from a command prompt on how it’s progressing (not something that happens with xcopy or copy).

Say you want to copy a file called BigFile.iso from the root of the C:\ Drive to the root of the E:\ drive you could use the following command

robocopy C:\ E:\ BigFile.iso

/ JC

Posted in Uncategorized | Leave a comment