The Deployment Bunny

OS Deployment, Virtualization, Microsoft based Infrastructure…

  • Archives

  • Meta

Nice to Know – Fix High DPI resolution issues in Windows 10

Posted by Mikael Nystrom on January 19, 2018

Working at a customer, we had major issues with an application. It does not handle the new “Improving the high-DPI experience in GDI based Desktop Apps”.


Using the AppCompat mode by disable the built in functions work:

But, that does not fly for 1500 machines. Using ACT would work, but…

This one is easy…

REG ADD "HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /V "C:\Program Files(x86)\folder\app.exe" /T REG_SZ /D "~ DPIUNAWARE" /F

More info:

"~ HIGHDPIAWARE" = Override high DPI scaling behavior (Application)

"~ DPIUNAWARE" = Override high DPI scaling behavior (System)

"~ GDIDPISCALING DPIUNAWARE" = Override high DPI scaling behavior (System Enhanced)


Posted in ACT, OSD, Windows 10 | Tagged: , , | Leave a Comment »

Nice to Know – What does my home lab looks like?

Posted by Mikael Nystrom on January 11, 2018

I often get the question

– What kind of stuff do you have to runt labs, tests and play with?

I have a understanding wife and a very generous CEO, so here it is…

In my back pack:

1 x HP Studio G3 with 32 GB ram and 2 x 1TB NVME drives

1 x Microsoft Surface Pro 4

The Surface works as my “office” machine, it also runs Insider Preview (fast) and the HP Studio is my LAB/Demo/Dev machine. It runs Windows Server 2016 and contains about 100-150 VM’s

At Home:


I have one full rack and one half rack, the half rack contains 6 HP Micro Server Gen 8, used as test/dev machines, the full rack runs 2 HP ML 350 Gen 8, they run Azure Stack as well Azure Pack in a full Fabric based on HCI and the entire System Center stack

The Case:

I also have a Pelican Case (Yellow) that runs a bunch of Intel NUC’s devices

Posted in Fun | Tagged: | Leave a Comment »

Nice to Know – You need to do a site reset after OS upgrade on your ConfigMgr site server

Posted by Mikael Nystrom on January 11, 2018

Working at a customer, doing an in place upgrade from Windows Server 2008 R2 server with ConfigMgr 1606 to Windows Server 2016.

After the upgrade a connection to the ConfigMgr cannot be made using the console, investigating it and we found out that the Root\SMS namespace has gone, (even running as system it was not to find)

Asking around, no one have seen this, but my friend Johan Arwidmark sent an email to the product team, and the reply was easy to understand (yet, undocumented)


You do need to do a site reset after an OS upgrade, and after that, it all works like a charm

Here is some guidance to doing such upgrade, just don’t forget to run a site reset.


Posted in ConfigMgr | Tagged: | Leave a Comment »

PowerShell is King – Test-NetConnection is annoying, gives me warnings, I don’t want that

Posted by Mikael Nystrom on December 7, 2017

During a conversation someone told me that Test-NetConnection is kind of annoying when scanning for systems and some of them are not online, or missing from DNS or something like that. And that is true, it doesn’t matter if you sending the result down the pipeline, but it does show up in the warning stream.

The annoying way

In the first sample we run Test-NetConnection using the following

$Computers = "SRVDC01","SRVDC02","SRVDC03","SRVHOST301"
$result = foreach($Computer in $Computers){
    Test-NetConnection -ComputerName $Computer -CommonTCPPort SMB

And here is the output, note the warning stream that shows up


The non annoying way

In the second sample we run Test-NetConnection using the following

$Computers = "SRVDC01","SRVDC02","SRVDC03","SRVHOST301"
$result = foreach($Computer in $Computers){
    Test-NetConnection -ComputerName $Computer -CommonTCPPort SMB -ErrorAction SilentlyContinue -WarningAction SilentlyContinue

And here is the output



Posted in Uncategorized | Leave a Comment »

Nice to Know – Mass upgrading Windows 10 Using PowerShell

Posted by Mikael Nystrom on December 5, 2017

Someone asked med a while back

– Is it possible to upgrade our Windows 7,8,8.1 and unsupported Windows 10 machines to a supported version of Windows 10 without a deployment solution?


– You mean without running around to all machines?


– Yes, it is possible

Before explaining how that can be done, let’s be clear, if you have ConfigMgr or Microsoft Deployment Toolkit, that is far better then doing it this way, but you could be in a situation when that is not an option but you still need to achieve the same goal, upgrade to a supported version of Windows 10. (I’ll write another post on how to combine the scripts here with MDT)


Assuming you have a licensed version of Windows 10, the Windows 10 Media, a network and access to all the computers over the network it will be possible to push out an upgrade. This method also works if you are running an older version of Windows 10 and would like to upgrade to a never version of Windows 10. The way to do this is rather easy, we basically need to perform the following steps:

– Enable remote access for PowerShell

– Copy the media down to the computer

– Run a compatibility scan to verify that we can upgrade

– Upgrade

Create a CSV file for computers that should be upgraded:

First of all we need to create a .CSV file with the computers that should be upgraded, the file contains the 3 servers I would like to upgrade to Windows 10.

Content of computers.txt

Store the file in your computer, in my case I stored it in D:\Upgrade2w10\Computers.txt

Enable remote access for PowerShell:

We need to access the computers using Remote PowerShell and therefor we need to enable that. This can be done using various method and one easy/weird/fun way to to that is to use WMI. The script below will connect using WMI and execute two commands on each server:

The following PowerShell script enables WinRM (Remote Access) and Remote PowerShell.

Content of Invoke-ComputerPrep.ps1

The result after running the script is this:


Copy the media down to the computer:

Now when we have access to all the machine, we can copy the media down to each machine and we will do that in a reversed way. We will create a scheduled task on each Windows 7 machine and the scheduled task will then download the content to the local hard drive. You need to edit the settings in this file to match your environment.

Content of Invoke-ImageDownload.ps1

Here is how it looks when you run the script:


Run a compatibility scan to verify that we can upgrade:

Ok, so we have the Windows 10 image in the C:\Source folder of each computer, now lets run the Compat Scan.

The script will connect to each computer, create a plain vanilla .BAT file and then we will remotely execute that:


And here is the result, as you can see all, none of the machines had any issues.



Ok, so the final step. The only thing we need to do is fire up the install program, and for that we use PsExec, it’s old but works for this kind of work.

The script will connect to each machine, create a .BAT file and then we let PSExec execute it.

Content of Invoke-ComputerUpgrade.ps1

Here is the result of running that, as you can see all (you can only see Win-01) of the machines is returning a success (return code 0)


Ok, so, what next, well, since the return code was 0, lets restart them…


The scripts can be downloaded here:


Posted in OS Deployment, OSD, Windows 10 | Tagged: , , | Leave a Comment »

The October 2017 Update – “Inaccessible Boot Device”

Posted by Mikael Nystrom on October 11, 2017

Also known as:

KB4041676 -

KB4041691 –


Affected systems:

This only affects systems that are managed trough WSUS and the patches was approved at the same time as the “delta” updates also was approved. Those updates was never intended to show up in WSUS, they should be deleted/Declined. You should NEVER have Delta updates in WSUS. It was a “woops” somewhere. But if they were approved, and distributed, and download, and installed at the SAME time as the full patch, then you are affected

These should be declined, and they should be gone at the next sync.


After installing the update and reboot, the pc will not boot, instead it gives you ”Inaccessible Boot Device”

Official Solution:

Currently the official solution is to contact Microsoft Support, but it is possible to use DISM.exe or PowerShell to remove the updates or reverse back a folder name.

read about the issue here (from Microsoft)

Information regarding the Delta’s from Microsoft in a forum.

The Quick fix Solution:

A very nice MVP manage to figure out how to remove all the updates using DISM, and yes, it does work like a charm!

(update: If this is a VM, you might need to add more memory. We have found that you need at least 3GB of RAM for WinPE to use larger scratch space.)

Other ways to fix it is:

The idea is to rename the WindowsApps folder and that seems to work for some



Posted in Windows 10, Windows Server 2016 | Tagged: , | 29 Comments »

OSD – Adding Description to the WIM file during Build and Capture

Posted by Mikael Nystrom on October 10, 2017

The default capture function in MDT does not add any description. It is not needed, but can be added by modifying ZTIBackup.wsf. In this case I added the Task Sequence Name, but you can add other things as will, like Task Sequence Description or Task Sequence version. I did this at a demo at Microsoft Ignite last week but I did not post it at that time, so here it is.

The Session from Ignite is here if you would like to see it:

The how:

Modifying the Script

Take a copy of ZTIBackup.wsf, open it in your favorite VBscript editor and look for this section:


At line 436 you will see this:

sCmd = " /Capture-Image /CaptureDir:" & oDrive.Path & "  /ImageFile:""" & sBackupPath & """  /Name:""" & sPrefix & Left(oDrive.Path, 1) & "Drive"" /Compress:MAX /ConfigFile:""" & sWimScriptPath & """ /ScratchDir:""" & oUtility.LocalRootPath & "\Scratch"""

Change that to:

sCmd = " /Capture-Image /Description:""" & oEnvironment.Item("TaskSequenceName") & """ /CaptureDir:" & oDrive.Path & "  /ImageFile:""" & sBackupPath & """  /Name:""" & sPrefix & Left(oDrive.Path, 1) & "Drive"" /Compress:MAX /ConfigFile:""" & sWimScriptPath & """ /ScratchDir:""" & oUtility.LocalRootPath & "\Scratch"""

(The yellow text shows the modification)

The result:

Using Get-WindowsImage will show you that the description is now set to the Task Sequence name:


If you import the WIM file into ConfigMgr you will also see the description set as well as the Comment:



Posted in ConfigMgr, Ignite, MDT, OS Deployment, OSD | Tagged: , , , , | 1 Comment »

Event – TrueSec Infrastructure Summit 21 of June–summer 2016

Posted by Mikael Nystrom on May 24, 2017

(Note: This event is held in the Swedish Language)

Vi har nu kört Windows Server 2016 och Windows 10 under lång tid och vi har samlat på oss så mycket erfarenhet, en del fantastiska upptäckter, en del mindre lustiga. Vi tror att du vill veta det här, så att du kan undvika “slukhålen” som vi själva har trillat ner i. Det här gäller så klart både på klientsidan där vi trodde att man skulle få helt andra problem än vad man verkligen fick, samma sak på datacenter sidan, det blev inte riktigt som vi trodde. Så vi har samlat ihop gänget som är där ute och jobbar och sliter varje dag och kör en heldag på Rival i Stockholm. Kan du inte komma dit, kan du sitta hemma i soffan och njuta ändå, vi kör ju med LiveStream. Så, ta genvägen till erfarenhet, och häng med oss på Rival, Stockholm!

TrueSec Infrastructure Summit, Stockholm, Sweden June 21



Posted in Event | Tagged: | Leave a Comment »

OSD – Workaround for ADK issue in 1703

Posted by Mikael Nystrom on May 16, 2017

The issue in ADK 1703 is that you cannot mount a WIM file in MDT/ConfigMgr, due to a signing issue with the WIM Mount Driver when running a system with UEFI and Secure Boot.


Michael Niehaus did found a workaround today, and that is to use the existing WIM mount driver that is already in the system.



Posted in ADK, Windows 10 | Tagged: , | Leave a Comment »

PowerShell is King – A Data Deduplication script that runs the Optimization,Garbage Collection and Scrubbing in a single sweep, including progress

Posted by Mikael Nystrom on April 28, 2017

I use Windows Server 2016 on all my lab machines, therefore I also use Data Deduplication to save space. But I don’t run it in the background, i run it basically when I need space.

The PowerShell script. (

Function Wait-VIADedupJob
while ((Get-DedupJob).count -ne 0 )
Start-Sleep -Seconds 30

foreach($item in Get-DedupVolume){
$item | Start-DedupJob -Type Optimization -Priority High -Memory 80
$item | Start-DedupJob -Type GarbageCollection -Priority High -Memory 80 -Full
$item | Start-DedupJob -Type Scrubbing -Priority High -Memory 80 -Full


Posted in Windows Server 2016 | Tagged: | 2 Comments »