C# runtime raising App privileges

南楼画角 提交于 2019-12-03 06:06:40

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!