如何在不提升权限的情况下测试用户是否在内置管理员组中?

时间:2012-08-02 21:48:52

标签: c# security .net-2.0

我期待这段代码:

WindowsPrincipal principal = new WindowsPrincipal( WindowsIdentity.GetCurrent() );
public bool UserHasAdminRights( WindowsPrincipal principal, WindowsBuiltInRole role )
{
  bool isAdmin;

  // get the role information of the current user
  if ( principal.IsInRole( role ) )
  {
    isAdmin = true;
  }
  else
  {
    isAdmin = false;
  }
  return isAdmin;
}
当用户在内置管理员组中时,

返回 true

无论其

IsInRole州的

MSDN

  

在Windows Vista中,用户帐户控制(UAC)确定权限   用户如果您是内置管理员组的成员,   为您分配了两个运行时访问令牌:标准用户访问权限   令牌和管理员访问令牌。默认情况下,您在   标准用户角色。当您尝试执行需要的任务时   管理权限,您可以动态提升您的角色   使用“同意”对话框。执行IsInRole的代码   方法不显示“同意​​”对话框。代码返回false   如果您是标准用户角色,即使您在内置   管理员组。您可以在提升之前提升您的权限   通过右键单击应用程序图标并指示来执行代码   您希望以管理员身份运行。

问题是如何修改此代码以使其返回true,如果用户位于内置Admin组中, WITHOUT 要求用户在运行时/之前提升权限?

1 个答案:

答案 0 :(得分:3)

由于我不能在评论中整齐地发布代码,就像我可以在这里一样,让我建议一些伪代码

var user = Windows.GetThisUser( me ); //current method (I said pseudo code)
function CheckIfImAdmin( user ) .... //current method
建议的方法:

var administrativeUsers = Windows.GetUsersInRole( "admin" ); //use a SID here, much more reliable
foreach(user in administrativeUsers){
  if (user == me) return true;
  return false;
}

虽然这可能看起来一样,但事实并非如此。而不是查询用户以查看它当前是否处于给定角色(非升级不是),而是关注管理员 的人,然后询问该组是否包含我想要的用户,即当前用户。