- Option Explicit
- Private Declare Function GetVersion Lib "kernel32" () As Long
- Private Declare Function IsAdminMode Lib "shell32" Alias "#680" () As Long
- Private Declare Function ShellExecuteA Lib "shell32" (ByVal hWnd As Long, ByVal sOper As String, ByVal sFile As String, ByVal sPrm As String, ByVal sDir As String, ByVal lShowCmd As Long) As Long
- Function GetVerMajor() As Long
- GetVerMajor = Val(Right$(Hex$(GetVersion), 2))
- End Function
- Sub RunMeAsAdminMode()
- If (IsAdminMode = 1) Then Exit Sub
- Call ShellExecuteA(0, IIf(GetVerMajor > 5, "runas", "open"), App.EXEName & ".exe", Interaction.Command$, App.Path, 10)
- End
- End Sub
- Private Sub Form_Load()
- Call MsgBox("Administrator mode = " & CBool(IsAdminMode), vbInformation)
- Call RunMeAsAdminMode
- End Sub
Giải thích sơ bộ:
Hàm GetVerMajor lấy ra byte thấp (LowByte) từ giá trị Long (4byte) trả về của hàm API GetVersion để lấy số phiên bản chính của Windows. (MajorVersion > 5: Win7, Win8, Win8Point1, WinSv2k12/R2, Win10)
Hàm IsAdminMode trả về kiểu Long cho biết ứng dụng có đang chạy quyền Admin hay không. 1 = có, 0 = không.
Đầu tiên ta kiểm tra xem ứng dụng có đang được chạy dưới quyền admin hay chưa, nếu chưa thì dùng hàm ShellExecuteA để chạy lại ứng dụng với quyền admin với tham số Operation = "runas" (áp dụng từ Win7 trở lên).
Code trên chỉ hoạt động với Standard Exe, còn ActiveX Exe nếu chưa đăng ký mà chạy ứng dụng không có quyền Admin sẽ bị báo lỗi: Unexpected error; quitting, vì thế chúng ta không thể áp dụng cách trên.
Đối với ActiveX Exe chúng ta có thể nhúng manifest vào resrouce.
DCS_MakeFileRunAsAdmin.exe trong file đính kèm là công cụ dùng để add manifest resource vào exe. Bạn có thể dùng để add cho ActiveX Exe hoặc các Standard Exe nếu không muốn dùng code trên.