AdjustTokenPrivileges可以以管理员身份提升权限吗?

时间:2012-08-18 14:33:41

标签: c++ windows visual-studio-2010 visual-c++ mfc

Windows下的程序需要管理员权限才能在用户启动时获得用户的权限。并且他们也可以通过右键单击EXE并选择“以管理员身份运行”来管理员权限运行。但是,在EXE开始之前,会出现一个消息框。真的很恶心。

现在我希望我的应用程序以管理员身份运行,当用户单击EXE文件时,我不想要弹出消息框。

现在我想知道AdjustTokenPrivileges函数是否可以帮助我实现这个目标。

任何人都可以帮助我?

2 个答案:

答案 0 :(得分:8)

你在权利和特权之间感到困惑。至少从Windows API的角度来看,两者完全不同(尽管它们在很多时候都被视为同义词,至少在处理“你可以在Windows上做什么”时)。

您真正想要的是提升权利的能力。缺少系统安全模型中的一些缺陷,您应该无法做到这一点。要获得管理权限,目的是代码必须在管理帐户下运行 - 最初由用户以管理员身份登录,或者由他们在运行时输入凭据,如您所见。

权限(AdjustTokenPrivileges实际操作的权限)是您正确要做的事情,但如果没有专门启用,仍然不允许这样做那种特权。例如,假设您开始以管理员身份登录。这为你提供了正确的来调整系统时钟 - 但调整系统时钟是普通程序几乎从来没有理由做的事情,所以他们在你做之前增加了一个额外的步骤 - 您需要启用SE_SYSTEMTIME权限才能使用该权限。

如果您是在没有权限的帐户下登录来更改系统时间,则根本无法执行此操作。如果您已登录可以更改帐户的帐户,则必须先启用该权限,然后才能执行此操作。

底线:AdjustTokenPrivileges无法实现您的目标。

答案 1 :(得分:0)

实际上有一种方法可以让你通过调用LogonUser API函数来更改线程的安全凭证。它返回一个可以在ImpersonateLoggedOnUserCreateProcessAsUser调用中使用的令牌句柄。这种技术被称为非人格化。

Howewer,我认为您正在尝试实现不同的事情 - 在没有UAC用户通知的情况下运行具有提升的管理权限的流程。您可以在msconfig实用程序中完全禁用UAC,这是一个非常糟糕的解决方案,或者保留您的程序,因为坦率地说,用户有权知道,当您的程序以超级用户权限运行时,并禁用此功能通知应该是他的决定。