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