-1

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

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

4

3 回答 3

5

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

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

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

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

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

于 2012-04-21T00:10:54.667 回答
2

您可能会发现有关权限的Windows 开发中心文章很有帮助,特别是在 C++ 中启用和禁用权限

于 2012-04-21T00:04:23.283 回答
2

虽然这是在 C# 中,但我不知道对你来说可能更容易。我所做的是检测是否以管理员身份运行有或没有提升的权限?,并且如果在请求管理权限时没有重新运行当前进程(如果启用了 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-04-21T00:10:09.663 回答