Q: Why Doesn’t Drag-and-Drop work when my Application is Running Elevated? – A: Mandatory Integrity Control and UIPI
If you run notepad elevated (Right click | Run as Administrator), and you try and drag-and-drop a file from Windows Explorer, nothing happens. It looks like it is going to work because the pointer icon changes but the file doesn’t open. Weird, huh?
What’s Going On?
In the traditional NT Security model (prior to Vista), all processes on the same desktop ran with the same security token and had all the same privileges. UAC changed this by allowing processes with different privilege levels on the same desktop.
Lower Privilege Processes Can’t Interfere with Higher Privilege Processes
In order to prevent potential elevation of privilege attacks, certain functionality needs to be blocked. This is implemented through Mandatory Integrity Control (MIC). All processes and all resources (files, registry, etc.) have an integrity level assigned. MIC prevents a standard user process from writing to a protected per machine location like Program Files or the HKLM registry hive. I won’t go too deep into MIC in this post but the following is a great resource if you want more info: Inside Windows Vista User Account Control.
User Interface Privilege Isolation (UIPI)
Okay, back to our drag and drop issue… A “sister” technology that works in conjunction with MIC is UIPI. UIPI blocks Windows messages being sent from process with a lower MIC level to one running at a higher MIC level. Drag-and-drop is implemented via Windows messages. Therefore, if you try and drag-and-drop a file from Windows Explorer (medium MIC) to Notepad running elevated (high MIC), the Windows messages are blocked and drag-and-drop doesn’t work.
You can use ChangeWindowsMessageFilterEx in your application to allow specified Windows messages to not be blocked. Unfortunately, this isn’t recommended as a safe solution for drag and drop due to the messages that drag and drop uses.
Okay. Now What?
The best solution is to only use drag and drop between the same MIC levels. With UAC enabled, Windows Explorer will run at a medium MIC level. Therefore, your application (Notepad in our example) needs to run at medium (or lower) MIC level. The bottom line is that drag and drop from Windows Explorer will not work if your application is elevated. If you find yourself in this situation, you may need to rethink your application design or not support drag-and-drop with UAC enabled.
Comments
Anonymous
October 10, 2015
Why would it be bad to move from less privelages to more?Anonymous
February 07, 2016
The comment has been removedAnonymous
February 22, 2016
Now this is downright a brain dead solution to a security problem. Why not just forbid using a GUI at all? I have a log viewing application and the most fast, handy and user friendly way to use it is by drag and drop. If the files are so unsecure, then opening them via a file dialog should also be blocked.Anonymous
February 23, 2016
Hi Lurker and Seriously?!, The need for UIPI is to prevent shatter attacks (See en.wikipedia.org/.../Shatter_attack). PatAnonymous
February 28, 2016
I didn't know about that one so thanks for sharing. But still, why block the messages that are designed and intended for interprocess communication? It indeed makes no sense to allow every possible message to be sent, but it also makes no sense to block messages that are meant to be shared (like drag-drop). It's like having a web browser that doesn't allow you to click on URLs to go to another site (which also was a Microsoft recomendation at some point). It's kind of mystifying that when logging in as Administrator, one cannot drag-drop files, but if logging in as a restricted user, it's allowed.Anonymous
February 29, 2016
The comment has been removedAnonymous
November 19, 2016
The comment has been removed- Anonymous
November 21, 2016
Hi DanoR,Drag and drop functionality will work as expected if applications run at the same integrity level when UAC is enabled. Because drag and drop uses Windows messages to communicate, you can't accept potentially untrusted data from a lower integrity process. Pat
- Anonymous
Anonymous
January 10, 2017
I just got bit by this hard. Lost too much time tonight, trying to figure out where I was going wrong with my code. Okay, so this is a necessary security "feature". Cool. But perhaps then the system should notify the user as to why they can't perform this drag and drop, instead of letting us spin our wheels...- Anonymous
January 10, 2017
Hi tbarela,Good point. The best place to submit developer product feedback is UserVoice. https://wpdev.uservoice.com/Thanks,Pat- Anonymous
July 06, 2017
Wow some people really upset to see the OS enforce security! lol
- Anonymous
- Anonymous
Anonymous
September 20, 2018
An interesting, alternative way to solve the UIPI "issue" is to let the program check its integrity level and restart itself at medium level. Works great without loosing the elevation state otherwise.