Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка наличия прав локального админа 
V
    Опции темы
mihanik
Дата 1.12.2014, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Привет всем.

Пишу программу, которая требует прв админа для работы.
Если пользователь входит в группу локальных админов, - всё нормально.
Если не входит - запрашивается логин и пароль админа и...  и опять всё нормально.

Но я просто просматриваю группу локальных админов и ищу там пользователя от имени которого запускается программа.

Ищу так...

Код

Public Function IsAdmin() As Boolean

Dim MyComputerName As String
Dim objGroup As Object
Dim MyUserName As String
Dim MyMember As Variant

    IsAdmin = False
    MyComputerName = Environ("COMPUTERNAME")
    MyUserName = Environ("USERNAME")
    
    Set objGroup = GetObject("WinNT://" & MyComputerName & "/" & "Администраторы" & ",group")
        For Each MyMember In objGroup.members
            If UCase(MyUserName) = UCase(MyMember.Name) Then IsAdmin = True
        Next
    Set objGroup = Nothing

End Function



А как быть, если в группу локальных входят только другие группы, а уже среди членов вложенных групп и может оказаться пользователь.

Можно, конечно, попробовать выполнить какое-нибудь действо, которое нельзя делать пользователям и опытным пользователям...
Получу ошибку? значит - не админ.
Не получу, - значит админ.

Но это мне не очень нравится.

Кто как решает этот вопрос?



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Akina
Дата 1.12.2014, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 453



Существует некий флаг в структуре исполняемого файла, который при запуске требует старта от имени локального админа. И если не так - запрашивает логин-пароль. Разумнее всего установить его - это штатно и наименее проблемно. 

Что за флаг - не спрашивай, я не спец. Но что он есть - стопудово.

Цитата(mihanik @  1.12.2014,  16:35 Найти цитируемый пост)
Можно, конечно, попробовать выполнить какое-нибудь действо, которое нельзя делать пользователям и опытным пользователям...Получу ошибку? значит - не админ.Не получу, - значит админ.

Не-админу может быть дано право на именно это действие. Обломишься с такой проверкой.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
mihanik
Дата 1.12.2014, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



И каждый раз вводить логин и пароль?
Не комильфо.
Я могу запустить программу от имени другого пользователя.
Это решено ранее.

ТОлько программа должна определить права пользователя.
Если есть права админа, то запускаем просто.
Если нет правов админа - то единожды запрашиваем их, прячем (предварительно зашифровав) в реестре и...
И запускаем дочернюю программу от имени пользователя с правами админа.



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 1.12.2014, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Похоже, что нужно использовать что-то типа API LookupPrivilegeValue 


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 1.12.2014, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Похоже, что нашёл...

Оказывается, что до висты (и windows server 2008) включительно проверить права админа было сущим пустяком.
А сейчас всё усложнилось...

ВОТ: http://bbs.vbstreets.ru/viewtopic.php?p=133980

Работает.

Код

    Option Explicit
    
    Option Base 0     ' Important assumption for this code

    Private Const ANYSIZE_ARRAY = 20 'Fixed at this size for comfort. Could be bigger or made dynamic.

    ' Security APIs
    Private Const TokenUser = 1
    Private Const TokenGroups = 2
    Private Const TokenPrivileges = 3
    Private Const TokenOwner = 4
    Private Const TokenPrimaryGroup = 5
    Private Const TokenDefaultDacl = 6
    Private Const TokenSource = 7
    Private Const TokenType = 8
    Private Const TokenImpersonationLevel = 9
    Private Const TokenStatistics = 10

    ' Token Specific Access Rights
    Private Const TOKEN_ASSIGN_PRIMARY = &H1
    Private Const TOKEN_DUPLICATE = &H2
    Private Const TOKEN_IMPERSONATE = &H4
    Private Const TOKEN_QUERY = &H8
    Private Const TOKEN_QUERY_SOURCE = &H10
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_ADJUST_GROUPS = &H40
    Private Const TOKEN_ADJUST_DEFAULT = &H80

    ' NT well-known SIDs
    Private Const SECURITY_DIALUP_RID = &H1
    Private Const SECURITY_NETWORK_RID = &H2
    Private Const SECURITY_BATCH_RID = &H3
    Private Const SECURITY_INTERACTIVE_RID = &H4
    Private Const SECURITY_SERVICE_RID = &H6
    Private Const SECURITY_ANONYMOUS_LOGON_RID = &H7
    Private Const SECURITY_LOGON_IDS_RID = &H5
    Private Const SECURITY_LOCAL_SYSTEM_RID = &H12
    Private Const SECURITY_NT_NON_UNIQUE = &H15
    Private Const SECURITY_BUILTIN_DOMAIN_RID = &H20

    ' Well-known domain relative sub-authority values (RIDs)
    Private Const DOMAIN_ALIAS_RID_ADMINS = &H220
    Private Const DOMAIN_ALIAS_RID_USERS = &H221
    Private Const DOMAIN_ALIAS_RID_GUESTS = &H222
    Private Const DOMAIN_ALIAS_RID_POWER_USERS = &H223
    Private Const DOMAIN_ALIAS_RID_ACCOUNT_OPS = &H224
    Private Const DOMAIN_ALIAS_RID_SYSTEM_OPS = &H225
    Private Const DOMAIN_ALIAS_RID_PRINT_OPS = &H226
    Private Const DOMAIN_ALIAS_RID_BACKUP_OPS = &H227
    Private Const DOMAIN_ALIAS_RID_REPLICATOR = &H228

    Private Const SECURITY_NT_AUTHORITY = &H5

    Type SID_AND_ATTRIBUTES
        Sid As Long
        Attributes As Long
    End Type

    Type TOKEN_GROUPS
        GroupCount As Long
        Groups(ANYSIZE_ARRAY) As SID_AND_ATTRIBUTES
    End Type

    Type SID_IDENTIFIER_AUTHORITY
        Value(0 To 5) As Byte
    End Type

    Declare Function GetCurrentProcess Lib "Kernel32" () As Long

    Declare Function GetCurrentThread Lib "Kernel32" () As Long

    Declare Function OpenProcessToken Lib "Advapi32" ( _
        ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
        TokenHandle As Long) As Long

    Declare Function OpenThreadToken Lib "Advapi32" ( _
        ByVal ThreadHandle As Long, ByVal DesiredAccess As Long, _
        ByVal OpenAsSelf As Long, TokenHandle As Long) As Long

    Declare Function GetTokenInformation Lib "Advapi32" ( _
        ByVal TokenHandle As Long, TokenInformationClass As Integer, _
        TokenInformation As Any, ByVal TokenInformationLength As Long, _
        ReturnLength As Long) As Long

    Declare Function AllocateAndInitializeSid Lib "Advapi32" ( _
        pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, _
        ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Long, _
        ByVal nSubAuthority1 As Long, ByVal nSubAuthority2 As Long, _
        ByVal nSubAuthority3 As Long, ByVal nSubAuthority4 As Long, _
        ByVal nSubAuthority5 As Long, ByVal nSubAuthority6 As Long, _
        ByVal nSubAuthority7 As Long, lpPSid As Long) As Long

    Declare Function RtlMoveMemory Lib "Kernel32" ( _
        Dest As Any, Source As Any, ByVal lSize As Long) As Long

    Declare Function IsValidSid Lib "Advapi32" (ByVal pSid As Long) As Long

    Declare Function EqualSid Lib "Advapi32" (pSid1 As Any, pSid2 As Any) As Long

    Declare Sub FreeSid Lib "Advapi32" (pSid As Any)

    Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long

    Public Function IsAdmin() As Boolean
        Dim hProcessToken       As Long
        Dim BufferSize          As Long
        Dim psidAdmin           As Long
        Dim lResult             As Long
        Dim X                   As Integer
        Dim tpTokens            As TOKEN_GROUPS
        Dim tpSidAuth           As SID_IDENTIFIER_AUTHORITY

        IsAdmin = False
        tpSidAuth.Value(5) = SECURITY_NT_AUTHORITY
       
        ' Obtain current process token
        If Not OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, True, hProcessToken) Then
            Call OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hProcessToken)
        End If
        If hProcessToken Then

            ' Deternine the buffer size required
            Call GetTokenInformation(hProcessToken, ByVal TokenGroups, 0, 0, BufferSize) ' Determine required buffer size
            If BufferSize Then
                ReDim InfoBuffer((BufferSize \ 4) - 1) As Long
               
                ' Retrieve your token information
                lResult = GetTokenInformation(hProcessToken, ByVal TokenGroups, InfoBuffer(0), BufferSize, BufferSize)
                If lResult <> 1 Then Exit Function
               
                ' Move it from memory into the token structure
                Call RtlMoveMemory(tpTokens, InfoBuffer(0), Len(tpTokens))
               
                ' Retreive the admins sid pointer
                lResult = AllocateAndInitializeSid(tpSidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, _
                        DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin)
                If lResult <> 1 Then Exit Function
                If IsValidSid(psidAdmin) Then
                    For X = 0 To tpTokens.GroupCount
                   
                        ' Run through your token sid pointers
                        If IsValidSid(tpTokens.Groups(X).Sid) Then
                       
                            ' Test for a match between the admin sid equalling your sid's
                            If EqualSid(ByVal tpTokens.Groups(X).Sid, ByVal psidAdmin) Then
                                IsAdmin = True
                                Exit For
                            End If
                        End If
                    Next
                End If
                If psidAdmin Then Call FreeSid(psidAdmin)
            End If
            Call CloseHandle(hProcessToken)
        End If
    End Function







--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1355 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.