.NET - 尝试确定用户是否正在运行ADMIN

时间:2016-08-19 20:43:14

标签: .net vb.net admin uac

我想弄清楚如何确定程序是否正在运行管理模式。我已经在.NET下面展示了我正在使用的一些示例编码:

Imports System.Security.Principal

Module Module1

    Sub Main()

        Dim id = WindowsIdentity.GetCurrent()
        Dim pr = New WindowsPrincipal(id)
        Dim isAdm As Boolean = pr.IsInRole(WindowsBuiltInRole.Administrator)

        If isAdm = True Then
             MessageBox.Show(Me, "Running Admin")
        else
             MessageBox.Show(Me, "Not Running Admin")    
        End If

    End Sub

End Module

这适用于大多数情况,但我有一个运行Windows 7 Professional的用户,无论如何以管理员身份运行,它都返回TRUE。

我不知道是什么原因造成这种情况,但有没有办法弄清楚为什么会这样,可能还有解决方案。要么弄清楚程序将始终返回true,无论是通过编码,还是解决此问题的编码。

任何线索?

1 个答案:

答案 0 :(得分:1)

我不知道.NET方式;但我可以给你原生代码,然后你可以P / Invoke调用:

/*
    This function returns true if you are currently running with admin privileges.
    In Vista and later, if you are non-elevated, this function will 
    return false (you are not running with administrative privileges).
    If you *are* running elevated, then IsUserAdmin will return true, 
    as you are running with admin privileges.

    Windows provides this similar function in Shell32.IsUserAnAdmin. 
    But that function is depricated. 
    This code is adapted from from the docs for CheckTokenMembership:
    http://msdn.microsoft.com/en-us/library/aa376389.aspx

    Note: 
       - you can be an administrator and not have admin privileges 
         (function returns false)
       - you can have admin privileges even though you're not an administrator 
         (function returns true)

    Any code released into the public domain. No attribution required.
*/

Boolean IsUserAdmin()
{
   Boolean isAdmin;

   PSID administratorsGroup = StringToSid("S-1-5-32-544"); //well-known sid

   if (!CheckTokenMembership(0, administratorsGroup, out isAdmin)
      isAdmin = false;

   FreeSid(administratorsGroup);

   return isAdmin;
}

注意:对管理员群组使用CheckTokenMembership与其他代码有很大不同。其他代码:

  • 使用OpenProcessToken获取“我”令牌
  • 使用GetTokenInformationTokenGroups获取TOKEN_GROUPS,其中列出了用户所属的所有群组
  • 使用EqualSid迭代返回的组,将它们与管理员SID进行比较

这是错误的,因为:

  

您可以成为管理员组的成员,但没有管理员权限!

此代码可用于了解是否提升;而IsUserAdmin会告诉您是否被提升。

同样,您可以拥有管理员权限,但不能成为管理员组的成员。使用IsUserAdmin()查看您当前实际是否拥有管理权限。