2012-04-20 125 views
-1

嗯,我注意到在Windows 7上,有时甚至当你是管理员时,你不能做很多事情,可能是某种错误,我的应用程序在启动程序之前检查用户是否是管理员,因为我的程序在受保护的文件夹中创建文件,如根文件夹(C:),并且如果您不是Windows 7的管理员,则只能创建文件夹那里。当用户已经是管理员时,通过C++激活管理员[以管理员身份运行]

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

+0

我认为问题是:如果有办法做到这一点,那么恶意软件会这样做,以获得管理员权限。 – Mysticial 2012-04-21 00:01:46

+4

文件夹限制和UAC弹出窗口是有原因的。如果你找到了一个方法,M $会冲出一个“重要安全更新”,你的代码将不再工作。 – 2012-04-21 00:04:02

+0

我不认为他试图规避UAC,我相信他想通过默认操作系统设置(UAC启用或禁用)来正常提升其应用程序的权限。 – 2012-04-21 00:08:13

回答

4

你可以添加一个清单给你的可执行文件 - http://msdn.microsoft.com/en-us/library/bb756929.aspx

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

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

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

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

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); 
} 

将未升高的过程将相当,有一个新的开始即要求管理权限。

相关问题