Определите, запущен ли другой процесс как «Запуск от имени администратора» для Visual Basic

Я задаю тот же вопрос, что и этот пост "Определить, если другой процесс запущен как «Запуск от имени администратора»"

Я пытался преобразовать код в Visual Basic самостоятельно, но получаю много ошибок. Что касается кода, это то, что у меня есть до сих пор:

    Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports System.Security.Principal
Imports System.Reflection

Namespace WindowsFormsApplication2
    Public Class ProcessHelper
        <DllImport("advapi32.dll", SetLastError:=True)>
        Private Shared Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As UInt32, <Out> ByRef TokenHandle As IntPtr) As Boolean
        <DllImport("kernel32.dll", SetLastError:=True)>
        Private Shared Function CloseHandle(ByVal hObject As IntPtr) As Boolean
        Private Const STANDARD_RIGHTS_REQUIRED As Integer = &HF0000
        Private Const TOKEN_ASSIGN_PRIMARY As Integer = &H1
        Private Const TOKEN_DUPLICATE As Integer = &H2
        Private Const TOKEN_IMPERSONATE As Integer = &H4
        Private Const TOKEN_QUERY As Integer = &H8
        Private Const TOKEN_QUERY_SOURCE As Integer = &H10
        Private Const TOKEN_ADJUST_GROUPS As Integer = &H40
        Private Const TOKEN_ADJUST_PRIVILEGES As Integer = &H20
        Private Const TOKEN_ADJUST_SESSIONID As Integer = &H100
        Private Const TOKEN_ADJUST_DEFAULT As Integer = &H80
        Private Const TOKEN_ALL_ACCESS As Integer = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or TOKEN_QUERY_SOURCE Or TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_SESSIONID Or TOKEN_ADJUST_DEFAULT)

        Public Shared Function IsProcessOwnerAdmin(ByVal processName As String) As Boolean
            Dim proc As Process = Process.GetProcessesByName(processName)(0)
            Dim ph As IntPtr = IntPtr.Zero
            OpenProcessToken(proc.Handle, TOKEN_ALL_ACCESS, ph)
            Dim iden As WindowsIdentity = New WindowsIdentity(ph)
            Dim result As Boolean = False

            For Each role As IdentityReference In iden.Groups

                If role.IsValidTargetType(GetType(SecurityIdentifier)) Then
                    Dim sid As SecurityIdentifier = TryCast(role, SecurityIdentifier)

                    If sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) OrElse sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) Then
                        result = True
                        Exit For
                    End If
                End If
            Next

            CloseHandle(ph)
            Return result
        End Function
    End Class

    Module Program
        <STAThread>
        Private Sub Main()
            Dim isAdmin As Boolean = ProcessHelper.IsProcessOwnerAdmin("outlook")
        End Sub
    End Module
End Namespace

Любая идея о том, что я могу делать неправильно здесь? Я пытаюсь проверить, являются ли другие процессы административным уровнем или нет. Я провел исследование, чтобы узнать, есть ли здесь какие-либо другие темы vb.net для этого. Кроме того, я провел простой поиск в Google и не смог найти ничего, кроме C#.

Большинство моих ошибок связаны с импортом dll и последующими приватными функциями.

Спасибо вам, ребята, в продвинутом!

^^^EDITTTTT 19:06 Итак, я применил код "RobertBaron", и это ошибка, которую я получаю? Не удалось найти темы, связанные с этой ошибкой.

Ошибка, связанная с редактированием в 19:06

^^^EDITTTTT 19:15

Извините, я смог найти ответ на свое редактирование. Я нашел ответ здесь: "https://docs.microsoft.com/en-us/dotnet/visual-basic/misc/bc31529", и теперь функции выглядят так.

 <DllImport("advapi32.dll", SetLastError:=True)>
    Private Shared Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As Integer, ByRef TokenHandle As IntPtr) As Boolean
    End Function

    <DllImport("kernel32.dll", SetLastError:=True)>
    Public Shared Function CloseHandle(ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

person Kory Haas    schedule 28.07.2019    source источник
comment
Вы знаете, что существуют автоматические онлайн-конвертеры кода, которые помогут вам перейти с C# на VB с меньшими проблемами?   -  person ADyson    schedule 28.07.2019
comment
В любом случае, если у вас есть ошибки и вы ожидаете, что мы вам с ними поможем, имеет смысл сообщить нам, в чем они заключаются, тогда нам не придется гадать...   -  person ADyson    schedule 28.07.2019
comment
В большинстве случаев вы просто хотите просто потребовать права администратора и заставить пользователей предоставить вам их, вы можете использовать stackoverflow.com/questions/2818179/   -  person Margus    schedule 28.07.2019
comment
RobertBaron смог предоставить исправленный код. Я сделал автоматические преобразователи кода, но они не помогли. Я использовал исправленный код RobertBaron, и все было хорошо, за исключением небольшой ошибки. Не могли бы вы, ребята, указать мне правильное направление?   -  person Kory Haas    schedule 29.07.2019
comment
Извините, я нашел ответ здесь docs.microsoft.com/en -us/dotnet/visual-basic/misc/bc31529   -  person Kory Haas    schedule 29.07.2019


Ответы (1)


Вот преобразованная функция.

Imports System.Runtime.InteropServices
Imports System.Security.Principal

Module Module1

    Sub Main(args As String())
        Dim result As Boolean
        result = IsProcessOwnerAdmin("calc")
    End Sub

    <DllImport("advapi32.dll", SetLastError:=True)>
    Private Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As Integer, ByRef TokenHandle As IntPtr) As Boolean
    End Function

    <DllImport("kernel32.dll", SetLastError:=True)>
    Public Function CloseHandle(ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    Private Const STANDARD_RIGHTS_REQUIRED As Integer = 983040
    Private Const TOKEN_ASSIGN_PRIMARY As Integer = 1
    Private Const TOKEN_DUPLICATE As Integer = 2
    Private Const TOKEN_IMPERSONATE As Integer = 4
    Private Const TOKEN_QUERY As Integer = 8
    Private Const TOKEN_QUERY_SOURCE As Integer = 16
    Private Const TOKEN_ADJUST_GROUPS As Integer = 64
    Private Const TOKEN_ADJUST_PRIVILEGES As Integer = 32
    Private Const TOKEN_ADJUST_SESSIONID As Integer = 256
    Private Const TOKEN_ADJUST_DEFAULT As Integer = 128
    Private Const TOKEN_ALL_ACCESS As Integer = (STANDARD_RIGHTS_REQUIRED _
                Or (TOKEN_ASSIGN_PRIMARY _
                Or (TOKEN_DUPLICATE _
                Or (TOKEN_IMPERSONATE _
                Or (TOKEN_QUERY _
                Or (TOKEN_QUERY_SOURCE _
                Or (TOKEN_ADJUST_PRIVILEGES _
                Or (TOKEN_ADJUST_GROUPS _
                Or (TOKEN_ADJUST_SESSIONID Or TOKEN_ADJUST_DEFAULT)))))))))

    Public Function IsProcessOwnerAdmin(ByVal processName As String) As Boolean
        Dim proc As Process = Process.GetProcessesByName(processName)(0)
        Dim ph As IntPtr = IntPtr.Zero
        OpenProcessToken(proc.Handle, TOKEN_ALL_ACCESS, ph)
        Dim iden As WindowsIdentity = New WindowsIdentity(ph)
        Dim result As Boolean = False
        For Each role As IdentityReference In iden.Groups
            If role.IsValidTargetType(GetType(SecurityIdentifier)) Then
                Dim sid As SecurityIdentifier = CType(role, SecurityIdentifier)
                If (sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) OrElse sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid)) Then
                    result = True
                    Exit For
                End If
            End If
        Next
        CloseHandle(ph)
        Return result
    End Function

End Module
person RobertBaron    schedule 28.07.2019
comment
Я применил ваш исправленный код. И у меня осталась одна небольшая ошибка, которую я не смог исправить. Я импортировал изображение ошибки в свой пост выше ^^^ - person Kory Haas; 29.07.2019
comment
@Kory Haas - вы должны объявить функции DllImport как Shared. В моем примере они были в Module и поэтому неявно объявлены как Shared. - person RobertBaron; 29.07.2019
comment
@Kory Haas - Если это ответ на ваш вопрос, не забудьте принять его! - person RobertBaron; 29.07.2019