3

我期望这段代码:

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) 确定用户的权限。如果您是 Built-in Administrators 组的成员,则会为您分配两个运行时访问令牌:一个标准用户访问令牌和一个管理员访问令牌。默认情况下,您是标准用户角色。当您尝试执行需要管理权限的任务时,您可以使用“同意”对话框动态提升您的角色。执行 IsInRole 方法的代码不显示同意对话框。如果您是标准用户角色,即使您在内置管理员组中,代码也会返回 false。在执行代码之前,您可以通过右键单击应用程序图标并指示您要以管理员身份运行来提升您的权限。

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

4

1 回答 1

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;
}

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

于 2012-08-02T22:25:24.627 回答