【问题标题】:C# runtime raising App privilegesC# 运行时提升应用程序权限
【发布时间】:2014-07-15 16:03:24
【问题描述】:

我已经尝试了 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... :(");
            }
        }
    }
}

【问题讨论】:

  • 你确定你启用了 UAC 吗?如果您不以非管理员身份运行它,它只会正常运行而不要求提升。这可以解释您所看到的循环。
  • @chickenpie 是的,UAC 已启用。不过,这可以解释 Windows XP 中的行为,因为它没有 UAC。
  • 我有相同的清单,但没有 applicationRequestMinimum 部分,它工作正常。您能否再次检查清单文件是否在应用程序选项卡下的项目属性中指定?
  • @chickenpie 是的。清单沿 Exe 部署。它有效,但仅在一种情况下(请参阅我上面的编辑)。如果你能帮助我,我可以把整个项目发给你。 :-)

标签: c# xml user-permissions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 2011-08-27
    • 2020-05-21
    • 2021-01-09
    • 2011-12-16
    • 2011-11-13
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多