How To Set Up Enterprise Mode for Microsoft Edge

AKA How to force certain websites when opened in Edge, to instead open in Internet Explorer.

Update 15th June 2022:
Note that there’s another way to now do this, using Enterprise Site List Manager which is an in-browser version of the standalone Enterprise Mode Site List Manager tool. Check it out using edge://compat/SiteListManager and here’s the official documentation:
https://docs.microsoft.com/en-us/deployedge/edge-ie-mode-site-list-manager
To access this via the Microsoft 365 admin center: Settings – Microsoft 365 admin center

Update 17th January 2020:
The New Edge is out, and there’s 1 extra Group Policy to do: Enable ‘Configure Internet Explorer integration’ and set it to ‘Internet Explorer Mode’ to open inside Edge as IE, or ‘Internet Explorer 11’ to open sites seperately in IE11 . The rest of this article still applies and is needed to make this work. Official documentation on docs.microsoft.com

Original Post:

Microsoft Edge is undergoing a big change with the underlying platform being migrated to Chromium – things will change with that (along with a new Internet Explorer mode) but that doesn’t help right now.

Many companies have certain websites they need to use that either require Internet Explorer, or work best in Internet Explorer. This isn’t about what browser is ‘best’, but some solutions were designed with only Internet Explorer in use.

Getting users to use the right website in the right scenario can be a pain, and every user seems to have their own opinion on what browser they prefer to use. Microsoft Edge has a great solution for this – Enterprise Mode. There was also an Enterprise Mode in Internet Explorer that worked in a similar way too, where you could force certain sites to run as a certain version of IE for compatibility reasons.

This is quite easy to set up, but I’ve found the existing documentation rather confusing to follow and doesn’t give an end to end explanation – or documentation is rather outdated and was written when the feature first came out, with a lot of options changing since then.

Step 1Enterprise Mode Site List Manager

Download Enterprise Mode Site List Manager (schema v.2) and install it. This is the program you’ll use to manage the sites you want to force to use IE rather than Edge:

Enterprise Mode Site List Manager will start off blank. Click the ‘Add’ button on the bottom, type in the URL of the site you want to use (don’t worry about http or https if you want to catch both). You then tell it what to do with that URL – Open in IE, Edge, or do nothing. Since we’re opening everything in Edge except what we want in this list, open in IE11 is the option we want, and leave it at the default IE8 Enterprise Mode (or change this if you need a different compatibility mode).

There’s two parts to maintaining a list – Exporting/Importing lists, and Saving as XML:

Once you have a record to test, go to File > Export. This will save your details into an .emie2 file, and put that somewhere central and safe. The idea is that you’ll need to import that file list to make a change, then export again. If you don’t do this, you won’t have a way for others to get the list of sites and make changes by importing that file at a later date. It has in-built version control (this is important, more later), in the screenshot above you can see it’s version 5.

Then, you can save your URL to an XML file. This is what Edge will read when it launches. Either save this file centrally where everyone can read it (no write access required, just read), or copy it to everyone’s computer locally via GPO. Personally I’ve just put it in a central location.

Step 2 – Configure Group Policy or Intune

I’m using Group Policy, but the Microsoft Documentation mentions Intune is supported too – we’re only changing registry settings, so that makes sense.

Turning on Enterprise Mode can be done at either the Computer or User level, and is under > Policies > Administrative Templates > Windows Components > Microsoft Edge > Configure the Enterprise Mode Site List.

Enable this setting, and in the options enter the path of where your XML is – e.g. \\server\sharename\edge.xml – or C:\Data\edgesettings.xml. Although the Group Policy says URL, it’ll accept UNC paths or drives.

If you’ve used a Computer Configuration setting, gpupdate then reboot (or reboot twice). To tell if the setting has applied, check the value of the registry setting:

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\MicrosoftEdge\Main\EnterpriseMode 

or 

HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\MicrosoftEdge\Main\EnterpriseMode

SiteList = The path you entered in the Group Policy setting.

If you’re see that, great! Group Policy is working. One caveat if you have System Center Configuration Manager (ConfigMgr) – it can potentially use this setting also as per this technet thread which is exactly what I had. I was testing a user policy, but this was configured at both the user and computer levels so my user setting was being ignored. I’m not sure if this is still used, but worth being aware of.

Version control is also recorded in the registry. It lives under:

HKEY_CURRENT_USER\Software\Microsoft\MicrosoftEdge\Main\EnterpriseMode

CurrentVersion = 5

regardless of the SiteList being under Computer or User. There’s a few catches with this – first, it’ll only show up after Edge is launched, and you wait ~65 seconds. It’ll show the same version as what’s contained in the XML, which was the version we saw in Enterprise Mode Site List Manager.

If you have the ConfigMgr setting, or have ever had Enterprise Mode for Edge enabled in your environment, then the version might already exist and be higher than what you’ve tried to deploy. On my PC, I saw version 28000 something – that’s a lot of versions.

You’ll need to either delete that value for everyone to start back at 0, then after Edge is launched per user, it’ll update to whatever your XML file contains, or update the version in Enterprise Mode Site List Manager to a higher number than whatever’s out there in your environment.

To change the version in Enterprise Mode Site List Manager, on the computer with it installed navigate to

C:\Users\your username\AppData\Roaming\EMIESiteListManager\ – in that path should be a file called SiteList.xml.

That file should have the first line as <site-list version=”5″> or whatever the current version is, and you can just change that ‘5’ to whatever number you want. Open Enterprise Mode Site List Manager and you’ll see that updated version number, which will then get written +1 to the XML file next time you save it out.


That’s really it – it’s simple, but there are a few catches I ran into when testing. Once this is in place, if a user goes to a site that you’ve listed in the XML, a new window opens in IE and goes to that site instead. It’ll also support subsites, so you don’t need to sent traffic for an entire domain like adamfowlerit.com there, it could be adamfowlerit.com/news and only hits to that subdomain will be triggered.

There’s a few other Group Policy settings around this such as forcing all intranet sites to go to IE, you’ll need to work out what’s best for your environment.

Blocking Legacy Authentication – Conditional Access vs Authentication Policies

I’ve already written a post on why Legacy Authentication (Basic) is bad, and Modern Authentication is good. At the time of writing, Authentication Policies were the way to go to block Legacy Authentication methods. Of course, things change and there’s now a better* option to look at – Conditional Access.

I’ve also covered Conditional Access before, and it’s really hard to fault the solution. There are now Baseline policies deployed by default (still in preview though) to Azure AD tenants with recommended best practices:

Conditional Access Baseline Policies

One of these is for blocking legacy authentication – but I’m not going to recommend you turn this on (at least for starters, it’s good at the end when you know you have full modern authentication support), as it’s a tenant wide setting that has no exceptions if you need to allow legacy authentication for an account (unlike Require MFA for admins, which does allow exceptions).

Instead, you can create your own policy that does the same. This means you can gradually roll it out, and put exceptions in place until you either work around them, or live with them. If you have a requirement for an account that requires legacy auth, then you need to consider how else you’ll protect that account – can you use other Conditional Access policies to restrict it to a certain region/locations, certain apps, platforms etc – lock it down as much as you can, and make sure the account has a long unique password.

The single important setting to block legacy auth via a Conditional Access Policy is blocking access to ‘Other clients’ via Client apps:

Microsoft have a full guide on how to set this up on docs.microsoft.com.

So, why is this better than using Authentication Policies? Two main reasons:

If an account has their access or signin blocked due to an Authentication Policy, it’s not logged. You can look at the user in Azure AD and check the sign-ins, but you won’t see anything. However, if it blocked via Conditional Access, you’ll have a nice log entry showing you it was blocked:

Side note: Although in this example I was logging in from Australia, I was trying to connect to Exchange Online via PowerShell. That seems to often be detected as being in the US, so be careful with region blocking.

The other reason is that Authentication Policies can take up to 4 (!) hours to apply, although it’s often more like an hour. That is a long time to wait, and you just have to keep waiting and trying until it works – except if you did it wrong, you won’t know and you’ll keep waiting. Or, if you need to unblock access while rolling out, it’s a long time to roll back.

Authentication Policies do have their place though, they give more granular control over what you want to block or not – say you know you want to block POP3 access company wide, but not IMAP – that’s possible in there, but not via Conditional Access.

Unless you have a good reason to use Authentication Policies, just use Conditional Access (and assuming you have Azure AD Premium P1 or P2 licensing to actually let you use Conditional Access, and if you are using Azure AD you should be on that licensing anyway). It’ll make your life easier!

Oculus Quest Review – Standalone VR Unit

It’s been two and a half years since I tried the Google Daydream, which I felt was a disappointment. Since then, there had been nothing that sounded like it was much better. Everything was either wired into a PC, or just an incredibly entry level experience with very little reason to bother.

That was, until I heard about the Oculus Quest. A standalone device, but with ‘proper’ controls like the PC connected Oculus Rift, HTC Vive, or any of the various Microsoft Mixed Reality headsets. I started to read up on it, and the more I read – the more it sounded like a winner. It had only just launched in the US, and people were raving about it online.

After a lot of consideration, I decided to order the 64gb Oculus Quest unit for $649AU (there’s a 128GB version for $799 which has no difference beyond the amount of storage doubled). That price point was probably the top I was willing to pay – $700+ just felt too expensive. There was also nowhere in Australia I could go to buy this device or check it out – Oculus has an online store, or via Amazon AU – I had to make the call to buy it unseen and untested.

I am really glad that I did. There’s not much to this – a headset, two controllers, 2 AA batteries and a very long USB-C cable for charging the headset.

What’s in the Oculus Quest box?

This is the first ‘proper’ VR device that really is consumer friendly to the masses. You take the headset and controllers out, put the batteries in, turn on the headset and you’re ready to start setting it up.

The quick tutorials shown are easy to understand – you’ll need to use your phone to set up the Oculus Quest once (like pointing it to a wifi network) but after that, you never have to use your phone again.

Like older VR units, you’ll need to set up your ‘boundary’ – that is, the area you map out in your physical space where you’ll use VR without hitting anything. Older headsets needed you to walk a controller around the room, but the Quest (and I believe the new Oculus Rift S) improves on this greatly.

First, you’re able to see the outside world with the headset on, when it’s in passthrough mode. It will show a black and white live footage of what you’re looking at/ In this passthrough mode, you can draw on the ground where your play area is, which then creates a grid wall. The wall only shows up when you get too close to it, and the closer you are, the thicker the grids are.

You can also just set a boundary for sitting experiences, which just creates a circle around you.

Passthrough also kicks in if you go outside the boundary you’ve set up which I think is a great safety feature (or if you just want to go get a drink and can’t be bothered taking the headset off, either way).

Setting up your Oculus Quest

Once set up, there’s the ‘First Steps’ tutorial for using your device. It teaches you how to use the controls, while giving you a sandbox to play around and experiment with what’s possible. This is the app to show anyone who hasn’t used VR properly before – it’s immersive, easy, and actually fun.

The graphics on the Oculus Quest are not going to match what’s possible from a PC, but they are good enough to be immersed and not think the visuals are lacking. If you came from PC VR you’d notice the downgrade in quality of course, but that’s the cost of portability.

Check out this comparison of Robo Recall as an example. It’s quite a fun game and I was more than happy with the graphics:

Most games also support streaming via Chromecast to a TV, so others can see what the headset wearer is doing – I can see this as a great small party device where people take turns, especially with a game like Beat Saber:

The controller quality in my opinion, is great. I’ve seen some online discussion around the magnet-secured battery clips falling off, but I’ve experienced no issues at all. They’re the same controllers that come with the PC powered Oculus Rift S, and have touch-sensitive controllers to know when you’re pressing certain buttons or not – allowing your virtual hand to move around a bit.

The tracking is also great – the 4 cameras on the device are enough to work out where your controllers are and what they’re doing, with a very high level of accuracy and low latency. I don’t notice any lag at all when moving my hands around in a virtual world – it’s as good as instant, while being incredibly smooth.

The biggest negative is the cost. The headset isn’t crazy expensive, but the games are. They’re generally between $20AU and $50AU per game, which is going to make you think long and hard about what you buy. It might not sound that bad, but a lot of the games don’t have huge replayability – you’ll finish once after 1-2 hours then move on. Beat Saber for example is $46.99, but at least that’s the sort of game you’ll want to play again and again while improving. There are some free games, and the store is highly curated so there’s no rubbish apps, but it’s worth being aware of.

Being the tinkerer that I am, I wanted to see what else was possible for free on the Oculus Quest, and wrote up a separate post around some utilities I’ve been using – check it out if you want to sideload apps (including custom Beat Saber songs), stream PC games to the Oculus Quest via Wifi and making Steam think it’s a supported plugged in device, or mirror everything you do on the Quest to a computer, rather than just certain in-game support.

With all of the above in mind, I still strongly recommend the Oculus Quest, as long as you don’t have a PC powered VR unit already. It’s a great all-round experience, with good-enough graphics and a lot of fun to be had. It’s the sort of thing I want to go back and play again and again because it is so different to other gaming experiences. Playing in a virtual world where you need to actually look around and react will both give you a bit of a workout, and make you forget where you are in the real world.

Oculus Quest Free Utilities Guide

I’ve reviewed the Oculus Quest separately, but in short it’s a really impressive piece of technology that’s ‘good enough’ graphics wise, and great at everything else.

If you’re a tinkerer however, you’ll want to do more than just use whatever is on offer via the Oculus Quest store. Here’s some free 3rd party utilities to get more out of your VR device:

SideQuest – This is an app to install on your PC which lets you sideload (install) apps outside of the Oculus Quest store. As the device is running on Android, if you’ve played around in that space before you’ll be fairly comfortable with this. Follow the Guide to set this up, you can’t break or brick your device but you could make things a bit messy; worst case is a factory reset.

At a very high level, you’re creating an Oculus Quest developer account (incredibly easy), and allowing 3rd party app installs to your device. Any app loaded via SideQuest won’t appear with a nice giant picture in the main screen, they’re found under Library > Unknown Sources.

There’s a bunch of specially built games and apps for the Oculus Quest already, as well as free betas of games that will launch later. If you’re looking for more free content for your device, this is the easiest way to get it installed.

SideQuest also has detailed Beat Saber integration where you can download and sync custom songs to play using bsaber.com as well as the ability to manage existing apps installed on the device – uninstall, clear data etc.

Scrcpy– This is a utility to run on a computer, that lets you mirror the view from inside the headset. Natively, the Oculus Quest can do some screen sharing via Chromecast, or mirroring to a mobile device, but it’s app dependent, and in beta.

Scrcpy has the ‘negative’ point of giving you the actual view from the headset, as in two giant round circles of graphics rather than a single rectangle view, but it’ll work in all scenarios. It’s really handy when you are trying to talk someone else through how to do something. You can reduce the view to a single circle with certain parameters when running (more below).

It’s possible to do this wirelessly and works quite well. Here’s a batch file you can run that’ll connect the Oculus Quest and launch the viewer. Note you will just see a black screen in the program until the Quest’s sensor starts displaying something.

@echo off
echo Plug in the Oculus Quest via USB-C
pause
for /f "tokens=9" %%a in ('adb shell ip route') do (echo IP of Oculus GO: %%a&set ipaddr=%%a)
adb tcpip 5678
echo Unplug the Oculus Quest's USB-C Cable
pause
adb connect %ipaddr%:5679
echo Connected! Launching scrcpy...
scrcpy.exe -c 1440:1600:0:0

ALVR (Air Light VR)- This is a utility to run on a computer to be able to use the Oculus Quest like any other VR device that would be plugged directly in (such as an Oculus Rift S).

This opens up a huge library of games and programs to run. You can play any Steam VR game this way – but really fast moving games like Beat Saber can be a bit sensitive to the latency added by wireless – but another game like Rick and Morty: Virtual Rick-ality works perfectly. A 5GHz router is recommended for this for higher throughput, and the Oculus Quest supports this too.

You’ll need to install the ALVR APK onto your headset (SideQuest can do that!), and install the ALVR Server software on the PC and run the ‘alvr.exe’ program.

Side note: Virtual Desktop does the same as ALVR, but it’s a paid product. Early on they were about the same, but Virtual Desktop seems to be a better and smoother experience now, so could be worth considering if you like ALVR.

With these three free solutions, you can get a lot more out of your Oculus Quest. Opening up the Steam library, being able to see what the wearer of the headset is seeing, and being able to add apps outside the Oculus ecosystem all add a lot of extra value to this already impressive (in my opinion) device.

How To Check What Files Are In Use On A Remote Windows Computer

This one had me stumped for a while, and I even asked on Twitter with a large amount of replies (thanks everyone who did!) but none that I could get to work, or that weren’t overly complicated requiring the compiling of code.

It’s easy locally to find out what files are open, and here’s a great article covering several free ways: https://www.winhelponline.com/blog/find-process-locked-file-openfiles-utility/

None of those worked remotely for me in a Windows 10 environment – but I thought Handle from the SysInternals Suite would be the best bet. Running locally, it did exactly what I wanted – a giant list of every file open, and say what process had it open (like WinWord.exe).

Using PSExec with Handle however, causes it to forever wait for something. On the remote PC, it definitely launches handle.exe and handle64.exe, but they have no activity. I thought it might be the EULA prompt getting stuck somewhere, but there’s a registry setting that will autoaccept that prompt, and putting that in place didn’t help (but I did check locally and it was skipping the EULA agree prompt. Thanks to this blog post explaining the reg key required https://peter.hahndorf.eu/blog/post/2010/03/07/WorkAroundSysinternalsLicensePopups which was:

reg.exe ADD HKCU\Software\Sysinternals /v EulaAccepted /t REG_DWORD /d 1 /f

I added this to the remote machine under both the user logged on to the remote device, and the user I was connecting as, with no luck.

After a bunch of Googling and trying solutions, I ended up finding this thread on stackoverflow. One of the answers with 0 votes (which can be easily overlooked) was a PowerShell script, invoking the command remotely, from a user called A.D – thank you A.D!

I’ve barely modified it for my purposes, but if this helps you please go vote his post up on stackoverflow (I did but don’t have enough rep for it to show):

$computerName = 'computername'
 $stringtoCheck = 'test' # String you want to search for, can be blank by removing text between '' quotes
 $pathtoHandle = 'c:\temp\handle.exe' #location of handle.exe on the remote server.
 Invoke-command -ComputerName $computerName -Scriptblock {
     param(
     [string]$handles,
     [string]$stringToCheck
     )
      "$handles /accepteula $stringToCheck" | Invoke-Expression 
     } -ArgumentList $pathtoHandle,$stringtoCheck

The script requires handle.exe to be on the remote computer under C:\Temp, and that of course you have admin rights to the remote PC with the account this script is being run. Beyond that, it’ll show back all open files that match the variable set in $stringtocheck across any of the results – it could be the path, the process that has the file open etc.

Why would you want to do this remotely at all? You might be troubleshooting something to do with open files and not want to interrupt the user. You might have a reason to see what files the user has open, or maybe it’s a locked PC and the user left.

Hope this helps others as it was a much harder task to accomplish than I assumed.