Проверка прав администратора пользователя - Visual Basic .NET
Формулировка задачи:
Столкнулся с необходимостью проверки прав администратора в приложении. Оказалось, что в ОС выше Vista права администратора приложению назначаются при запуске через RunAs, а вначале оно работает с обычными правами пользователя. На просторах интернета нашел пример, но автор пишет, что он не уверен в правильности его работы! По мне так работает, не могли бы Вы его проверить, может у Вас есть 100% работающие коды.Смущают английские комментарии.
Imports System.Runtime.InteropServices Imports System.Security.Principal Module Function_CheckAdmin Private Declare Function GetTokenInformation Lib "advapi32" (ByVal tokenHandle As IntPtr, ByVal tokenInformationClass As TokenInformationClass, ByVal tokenInformation As IntPtr, ByVal tokenInformationLength As Integer, ByRef returnLength As Integer) As Boolean 'information about the token to return. Private Enum TokenInformationClass TokenUser = 1 TokenGroups TokenPrivileges TokenOwner TokenPrimaryGroup TokenDefaultDacl TokenSource TokenType TokenImpersonationLevel TokenStatistics TokenRestrictedSids TokenSessionId TokenGroupsAndPrivileges TokenSessionReference TokenSandBoxInert TokenAuditPolicy TokenOrigin TokenElevationType TokenLinkedToken TokenElevation TokenHasRestrictions TokenAccessInformation TokenVirtualizationAllowed TokenVirtualizationEnabled TokenIntegrityLevel TokenUiAccess TokenMandatoryPolicy TokenLogonSid MaxTokenInfoClass End Enum ' elevation type for a user token. Private Enum TokenElevationType TokenElevationTypeDefault = 1 TokenElevationTypeFull TokenElevationTypeLimited End Enum Public Function IsAdmin() As Boolean ' предустанавливаем ответ функции IsAdmin = False Dim identity = WindowsIdentity.GetCurrent() If identity Is Nothing Then ' не возможно получить идетификатор пользователя Return False End If Dim principal = New WindowsPrincipal(identity) If principal.IsInRole(WindowsBuiltInRole.Administrator) Then ' если у пользователя есть права администратора возвращаем True Return True ElseIf Environment.OSVersion.Platform <> PlatformID.Win32NT OrElse Environment.OSVersion.Version.Major < 6 Then ' если версия ОС старше Vista тогда UAC отсутствует Return False Else ' если версия ОС младше Vista тогда обрабатываем токены для определения прав администратора Dim tokenInfLength As Integer = Marshal.SizeOf(GetType(Integer)) Dim tokenInformation As IntPtr = Marshal.AllocHGlobal(tokenInfLength) Try ' получаем токены из системы Dim token = identity.Token Dim result = GetTokenInformation(token, TokenInformationClass.TokenElevationType, tokenInformation, tokenInfLength, tokenInfLength) If Not result Then ' не возможно получить информацию о токене Return False End If Dim elevationType = DirectCast(Marshal.ReadInt32(tokenInformation), TokenElevationType) Select Case elevationType Case TokenElevationType.TokenElevationTypeDefault ' TokenElevationTypeDefault - User is not using a split token, so they cannot elevate. Return False Case TokenElevationType.TokenElevationTypeFull ' TokenElevationTypeFull - User has a split token, and the process is running elevated. Assuming they're an administrator. Return True Case TokenElevationType.TokenElevationTypeLimited ' TokenElevationTypeLimited - User has a split token, but the process is not running elevated. Assuming they're an administrator. Return True Case Else ' Unknown token elevation type. Return False End Select Finally If tokenInformation <> IntPtr.Zero Then Marshal.FreeHGlobal(tokenInformation) End If End Try End If End Function End Module
Есть ли необходимость в ручной очистке, если я правильно понял это так работает.
If tokenInformation <> IntPtr.Zero Then Marshal.FreeHGlobal(tokenInformation) End If
доработал код
Imports System.Runtime.InteropServices Imports System.Security.Principal Module Function_CheckAdmin Private Declare Function GetTokenInformation Lib "advapi32" (ByVal tokenHandle As IntPtr, ByVal tokenInformationClass As TokenInformationClass, ByVal tokenInformation As IntPtr, ByVal tokenInformationLength As Integer, ByRef returnLength As Integer) As Boolean 'information about the token to return. Private Enum TokenInformationClass TokenUser = 1 TokenGroups TokenPrivileges TokenOwner TokenPrimaryGroup TokenDefaultDacl TokenSource TokenType TokenImpersonationLevel TokenStatistics TokenRestrictedSids TokenSessionId TokenGroupsAndPrivileges TokenSessionReference TokenSandBoxInert TokenAuditPolicy TokenOrigin TokenElevationType TokenLinkedToken TokenElevation TokenHasRestrictions TokenAccessInformation TokenVirtualizationAllowed TokenVirtualizationEnabled TokenIntegrityLevel TokenUiAccess TokenMandatoryPolicy TokenLogonSid MaxTokenInfoClass End Enum ' elevation type for a user token. Private Enum TokenElevationType TokenElevationTypeDefault = 1 TokenElevationTypeFull TokenElevationTypeLimited End Enum Public Function IsAdmin() As Boolean Dim identity = WindowsIdentity.GetCurrent() If identity Is Nothing Then ' невозможно получить идетификатор пользователя Return False End If Dim principal = New WindowsPrincipal(identity) If principal.IsInRole(WindowsBuiltInRole.Administrator) Then ' если у пользователя есть права администратора возвращаем True Return True ElseIf Environment.OSVersion.Platform <> PlatformID.Win32NT OrElse Environment.OSVersion.Version.Major < 6 Then ' если версия ОС старше Vista тогда UAC отсутствует Return False Else ' если версия ОС младше Vista тогда обрабатываем токены для определения прав администратора Dim tokenInfLength As Integer = Marshal.SizeOf(GetType(Integer)) Dim tokenInformation As IntPtr = Marshal.AllocHGlobal(tokenInfLength) Try ' получаем токены из системы Dim token = identity.Token Dim result = GetTokenInformation(token, TokenInformationClass.TokenElevationType, tokenInformation, tokenInfLength, tokenInfLength) If result Then ' получена информация о токене Dim elevationType = DirectCast(Marshal.ReadInt32(tokenInformation), TokenElevationType) Select Case elevationType Case TokenElevationType.TokenElevationTypeDefault ' TokenElevationTypeDefault - User is not using a split token, so they cannot elevate. Return False Case TokenElevationType.TokenElevationTypeFull ' TokenElevationTypeFull - User has a split token, and the process is running elevated. Assuming they're an administrator. Return True Case TokenElevationType.TokenElevationTypeLimited ' TokenElevationTypeLimited - User has a split token, but the process is not running elevated. Assuming they're an administrator. Return True Case Else ' Unknown token elevation type. Return False End Select End If Finally If tokenInformation <> IntPtr.Zero Then Marshal.FreeHGlobal(tokenInformation) End If End Try End If ' ответ по-умолчанию Return False End Function End Module
Решение задачи: «Проверка прав администратора пользователя»
textual
Листинг программы
Public Function IsAdmin() As Boolean Dim identity As WindowsIdentity = WindowsIdentity.GetCurrent() If identity Is Nothing Then Return False Dim principal As New WindowsPrincipal(identity) Return principal.IsInRole(WindowsBuiltInRole.Administrator) End Function