In order to force your application above Metro's User-Interface you'll need to do the following:
- Create a Win32 Project
- Finish the wizard with no changes.
- Change the
CreateWindowEX
and set WS_EX_TOPMOST
- Go to
Project.Properties
and link to manifest file.
- Change UAC to bypass UI Protection; should be
/uiAccess = "true"
- Build your project.
- Use the
SignTool
to sign the application.
- Ensure the application is stored in
Program Files
or Program Files (x86)
- Run your application.
- Load your
Start Menu
and your application should be running above Metro.
Your manifest should look like:
<trustInfo xmlns="urn:0073chemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="highestAvailable"
UIAccess="true" />
</requestedPrivileges>
</security>
</trustInfo>
By default it is set to false
if the attribute is omitted, or a manifest doesn't exists for your assembly. With it false
you will not be able to gain access to ProtectedUI
.
More information on the security can be found here:
Here is a script that may work or allow modification to test UAC:
class Elevated_Rights
{
// Token Bool:
private bool _level = false;
#region Constructor:
protected Elevated_Rights()
{
// Invoke Method On Creation:
Elevate();
}
#endregion
public void Elevate()
{
// Get Identity:
WindowsIdentity user = WindowsIdentity.GetCurrent();
// Set Principal
WindowsPrincipal role = new WindowsPrincipal(user);
#region Test Operating System for UAC:
if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6)
{
// False:
_level = false;
}
#endregion
else
{
#region Test Identity Not Null:
if (user == null)
{
// False:
_level = false;
}
#endregion
else
{
#region Ensure Security Role:
if (!(role.IsInRole(WindowsBuiltInRole.Administrator)))
{
// False:
_level = false;
}
else
{
// True:
_level = true;
}
#endregion
}
}
}
Something like that to ensure that it you can handle or at least alert the user that the feature may not work. Please note that in the above I actually protect the call and invoke the method; that way I can access the _level
value at any point to ensure the authentication remains present. And it is only inherited or used when desired to avoid unnecessary calls. Hopefully that helps.
Update for Comment:
This is for your C# Project, you'd call the following:
using System.Diagnostics;
The above assembly will provide you the capability. Then inside a method just invoke the following.
Process command = new Process();
command.StartInfo.FileName = "notepad.exe";
command.Start();
As you can see it isn't to technical, but it will allow you to call a batch
, open a program, or even run other utilities such as msiexec
. Hopefully that helps.