1

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

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

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

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

4

1 回答 1

2

不,但有一个解决方法。

UAC 关闭并不妨碍应用程序以管理员身份运行(假设您有管理员密码,就像您所做的那样),只是让它变得更难。正如您正确指出的那样,在禁用 UAC 并requireAdministrator在清单中设置的情况下,右键单击并选择Run as administrator实际上并没有提升进程,正如 Microsoft 所指出的那样:“应用程序可能会启动,但稍后会失败

两个步骤:

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

截屏

2) 构建一个运行asInvoker并检查管理权限的小型可执行文件。当它在没有它们的情况下运行时,警告用户并告诉他们 Shift-Right Click,然后Run as a different user. 如果您的小程序具有管理员访问权限,则用于ShellExecute调用您的主requireAdministrator应用程序。有关流程图,请参见此处的图 9 。您基本上是用您自己的替换内置 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);
}
于 2013-11-05T19:10:33.037 回答