用户已经是管理员时,通过C ++激活管理员[以管理员身份运行]

时间:2012-04-20 23:59:46

标签: c++ windows uac

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

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

3 个答案:

答案 0 :(得分:4)

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

如果用户在打开UAC并且不是管理员的系统上运行,则在您的应用程序可以使用管理权限运行之前,包含requestedExecutionLevel level="requireAdministrator"的清单将生成管理员密码的提示。 (需要管理员权限意味着密码不正确或没有密码会阻止它完全运行)

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:2)

虽然这是在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);
}

未升级的过程非常复杂,启动了一个新的请求管理权限。