我有一个必须使用管理员权限执行的应用程序。如果UAC开启,一切都很好。但是,如果关闭UAC,则启动时没有提示(即使是标准用户),应用程序也会以受限权限启动。
使用动词“runas”启动流程不起作用。
是否有任何方法显示标准UAC登录对话框并执行具有管理员权限的应用程序,即使关闭UAC也是如此?
更新: 包括清单:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.1.6.0" processorArchitecture="X86" name="setup" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
当UAC处于活动状态时,和永远是可以的。但是如果UAC关闭它就不起作用。
更新2::MSDN Step 6: Create and Embed an Application Manifest (UAC)记录了此行为(请参阅“最后一行标准用户帐户的应用程序启动行为”表)。所以我无法用任何清单来解决这个问题。还有其他解决方案吗?
答案 0 :(得分:2)
我有一个非常类似的问题,我认为迄今为止的评论并未解决您的实际问题。我相信他们误解了你的问题的意图。虽然我的回答不会显示您第一次询问的实际UAC对话框,但它会显示一个解决方法。
UAC关闭 NOT 阻止应用程序以管理员身份运行(假设您有管理员密码,就像您所做的那样),只是让它变得更难。正如您正确指出的那样,在清单中禁用UAC并设置requireAdministrator
时,右键单击并选择Run as administrator
实际上并未提升该过程,因为Microsoft指示:"Application might launch but will fail later"
两个步骤:
1)按住Shift
,同时右键单击应用程序,然后选择Run as a different user
。然后只需使用管理员用户名和密码进行身份验证,您的应用程序应以管理员身份运行。它对我有用。
2)构建一个运行asInvoker
的小型可执行文件,并检查管理权限。在没有它们的情况下运行时,警告用户并告诉他们Shift-Right Click,然后Run as a different user
。如果您的小程序具有管理员访问权限,请使用ShellExecute
来调用主requireAdministrator
应用程序。有关流程图,请参阅Figure 9 here。
以下是来自StackOverflow某处的C ++中的一个小代码示例,用于检查管理员访问权限:
BOOL IsUserAdmin(VOID)
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup);
if(true==b)
{
if (!CheckTokenMembership( NULL, AdministratorsGroup, &b))
{
b = FALSE;
}
FreeSid(AdministratorsGroup);
}
return(b);
}