.NET - Ошибка при попытке выяснить, работает ли пользователь с ADMIN или нет

Я пытаюсь выяснить, как определить, работает ли программа в режиме администратора. Я показал некоторые примеры кодирования того, что я использую ниже в.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 независимо от кодирования, либо, возможно, решить проблему кодирования для этой проблемы.

Есть какие-нибудь подсказки?

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 получить токен "я"
  • использования GetTokenInformation а также TokenGroups получить TOKEN_GROUPS, в котором перечислены все группы, в которые входит пользователь
  • повторяет возвращенные группы, используя EqualSid сравнить их с SID администратора

Это неправильно, потому что:

Вы можете быть членом группы администраторов, но не иметь привилегий администратора!

Этот код может быть полезен, если вы хотите повысить его; тогда как IsUserAdmin говорит вам, если вы повышены.

Точно так же вы можете иметь права администратора, но не быть членом группы администраторов. использование IsUserAdmin() чтобы увидеть, есть ли у вас на самом деле административные права.

Другие вопросы по тегам