【问题标题】:Activating Administrator via C++ when users are already administrator [Run as administrator]当用户已经是管理员时通过 C++ 激活管理员 [以管理员身份运行]
【发布时间】:2012-04-21 08:16:06
【问题描述】:

好吧,我注意到在 Windows 7 上,有时即使您是管理员,也不能做很多事情,可能是某种错误,我的应用程序在启动程序之前检查用户是否是管理员,因为我的程序在默认受保护的文件夹中创建文件,例如根文件夹 ( C: ),如果您不是 Windows 7 的管理员,则只能在那里创建文件夹。

因此,如果我在我的应用程序中单击鼠标右键并选择“以管理员身份运行”,它就可以正常工作。 有没有办法让我的应用程序自动以管理员身份运行?我希望能够编写如下代码行:ActivateAdministrator(); 并完全可用于代码,因为我更改了属性,使用ifstream 创建文件。

【问题讨论】:

  • 我认为问题在于:如果有办法做到这一点,那么恶意软件就会这样做以获得管理员权限。
  • 文件夹限制和 UAC 弹出窗口是有原因的。如果你找到了绕过它们的方法,M$ 会冲出一个“关键安全更新”,你的代码将再次停止工作。
  • 我不认为他试图绕过 UAC,我相信他想通过默认操作系统的设置(启用或禁用 UAC)正常提升他的应用程序的权限。
  • 是的,很抱歉,现在我知道我的问题对你们来说是怎样的,我的意思是我希望一旦我的程序被要求运行,它需要管理员才能继续。
  • 如果您的程序需要管理员权限的唯一原因是在受保护的位置创建文件夹,为什么不直接在其他地方创建文件夹?

标签: c++ windows uac


【解决方案1】:

您可以将清单添加到您的可执行文件 - http://msdn.microsoft.com/en-us/library/bb756929.aspx

如果用户在打开 UAC 的系统上运行,并且不是管理员,则包含 requestedExecutionLevel level="requireAdministrator" 的清单将提示输入管理员密码,然后您的应用程序才能以管理员权限运行。 (需要管理员权限意味着密码错误或没有密码将完全停止运行)

如果他们是打开了 UAC 的管理员,那么相同的清单将导致一个是/否提示询问您的应用程序是否应该被授予管理权限。

当然,真正的问题是,无论您的应用程序在做什么需要管理权限,都需要进行检查。

大多数时候,普通用户级应用程序根本不需要该权限。这确实是一个应用程序设计问题 - 您的应用程序在做什么需要管理员权限? 真的有必要吗?例如如果您正在修改文件,那么为什么这些文件在文件系统的受保护区域中而不是在用户的配置文件空间中?

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      虽然这是在 C# 中,但我不知道它可能对你来说更容易。我所做的是Detect if running as Administrator with or without elevated privileges?,如果在请求管理访问时没有重新运行当前进程(如果启用了 UAC,则会向当前用户弹出一个窗口并询问程序是否可以使用管理权限运行)。

      然后一些简单的(但 C# 代码)看起来像:

      // UAC is a class from the previous link on SO
      if (UAC.IsCurrentProcessElevated())
      {
        string currentProcess = Assembly.GetEntryAssembly().Location;
        string arguments = string.Join(" ", this._Args.ToArray());
        ProcessStartInfo startInfo = new ProcessStartInfo(currentProcess, arguments); 
        startInfo.UseShellExecute = true;
        startInfo.Verb = "runas";
        Process.Start(startInfo);
      }
      

      未提升的进程将完全启动一个请求管理权限的新进程。

      【讨论】:

        猜你喜欢
        • 2012-11-22
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 2016-09-20
        • 2010-11-26
        • 2012-05-28
        相关资源
        最近更新 更多