如何在UAC关闭时提升应用程序?

时间:2013-10-09 16:18:29

标签: c# uac

我正在开发需要管理权限的C#/ .NET应用程序。它将在WinXP和Win7下运行。为了在用户作为Standar用户(不是Administrators组的成员)运行时请求提升权限,我使用行嵌入清单:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

而且,在UAC打开时,Win7中的工作正常。系统会提示用户提升权限,输入凭据等 问题是在Win7中何时关闭UAC。应用程序启动时没有UAC提示和没有提升权限。

当UAC关闭时,有没有办法请求提升和弹出UAC提示?

1 个答案:

答案 0 :(得分:2)

不,但有一种解决方法。

UAC关闭阻止应用程序以管理员身份运行(假设您拥有管理员密码,就像您所做的那样),只是让它变得更难。正如您正确指出的那样,在清单中禁用UAC并设置requireAdministrator时,右键单击并选择Run as administrator实际上不会提升流程,因为Microsoft指示:“Application might launch but will fail later

两个步骤:

1)在右键单击应用程序的同时按住Shift键并选择Run as a different user。然后只需使用管理员用户名和密码进行身份验证,您的应用程序应以管理员身份运行。它对我有用。

screenshot

2)构建一个运行asInvoker的小型可执行文件,并检查管理权限。在没有它们的情况下运行时,警告用户并告诉他们Shift-Right Click,然后Run as a different user。如果您的小程序具有管理员访问权限,请使用ShellExecute来调用主requireAdministrator应用程序。有关流程图,请参阅Figure 9 here。您基本上是用自己的UAC对话替换内置的UAC对话框,因为,嘿,UAC已关闭。

以下是来自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);
}