问题
I already tried every possible solution described in Stackoverflow.com, but I can't make an Application run as Administrator or prompt for Administrator privileges.
I tried:
- Creating a manifest with runAs="requireAdministrator"
- Setting manually "verb = 'runAs'"
But every instance just calls another that hasn't permissions, it just goes looping all the way. :(
The project is pretty simple and I can't find what is wrong.
Would you be so gentle to help me?!
Thanks!!!
EDIT: The looping behavior happens in Windows 7. With Windows XP it asks for permission, and even typing a valid user/password seems to fail. It won't loop, but calls only the first instance that doesn't have Administrator Privileges.
EDIT 2: The same code works fine in Windows 8. Windows XP hasn't UAC so it won't work. The problem persists with Windows 7 only.
EDIT 3: After several tries, I concluded that with a user set with the common "User" profile (default in Windows), the app does not prompt for Administrator access. That seems odd, should one have Administrator profile so the app can prompt for Administration access?! :S
My manifest
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
The code...
public partial class MainWindow : Window
{
public MainWindow()
{
Juca.raisePermissions();
InitializeComponent();
if (Juca.gotPower())
{
lblBad.Visibility = Visibility.Hidden;
lblGreat.Visibility = Visibility.Visible;
}
else
{
lblBad.Visibility = Visibility.Visible;
lblGreat.Visibility = Visibility.Hidden;
}
}
}
class Juca
{
public static bool gotPower()
{
var IdentidadeWindows = WindowsIdentity.GetCurrent();
var IdentidadePrincipal = new WindowsPrincipal(IdentidadeWindows);
return IdentidadePrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}
public static void raisePermissions()
{
if (!gotPower())
{
MessageBox.Show("I shall raise your permissions");
var processInfo = new ProcessStartInfo(Assembly.GetCallingAssembly().CodeBase);
processInfo.UseShellExecute = true;
processInfo.Verb = "runas";
try
{
Process.Start(processInfo);
}
catch (Win32Exception ex)
{
MessageBox.Show("Could not raise at all... :(");
}
}
}
}
回答1:
You specified "runas" verb in ProcessStartInfo. "Runas" is show as "Run as administrator". It is available for administrator accounts. For common user profile, only "runasuser" available, shell will open a login dialog to input administrator account name and password.
You can check verbs of .exe file in HKEY_CLASSES_ROOT\exefile\shell
来源:https://stackoverflow.com/questions/23877607/c-sharp-runtime-raising-app-privileges