C#运行时提升App权限

时间:2014-05-26 20:55:14

标签: c# xml user-permissions

我已经尝试过Stackoverflow.com中描述的所有可能的解决方案,但是我无法以管理员身份运行应用程序或提示管理员权限。

我试过了:

  • 使用runAs =“requireAdministrator”
  • 创建清单
  • 手动设置“verb ='runAs'”

但是每个实例只调用另一个没有权限的实例,它只是一直循环。 :(

项目非常简单,我找不到有什么问题。

你会如此温柔地帮助我吗?!

感谢!!!

编辑:循环行为发生在Windows 7中。在Windows XP中它要求许可,甚至键入有效的用户/密码似乎都失败了。它不会循环,但只调用没有管理员权限的第一个实例。

编辑2:相同的代码在Windows 8中运行正常.Windows XP没有UAC,所以它不起作用。问题仍然存在于Windows 7中。

编辑3:经过多次尝试,我得出结论,如果用户设置了常用的“用户”配置文件(Windows中默认设置),则应用程序不会提示管理员访问。这看起来很奇怪,如果有一个管理员配置文件,那么应用程序可以提示管理员访问?! :S


我的清单

<?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>

代码......

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 个答案:

答案 0 :(得分:0)

您在ProcessStartInfo中指定了“runas”动词。 “Runas”显示为“以管理员身份运行”。它适用于管理员帐户。对于常见的用户配置文件,只有“runasuser”可用,shell将打开一个登录对话框,输入管理员帐户名和密码。

你可以在HKEY_CLASSES_ROOT \ exefile \ shell中检查.exe文件的动词