Trang 1 trên 1

Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Năm 17/12/2015 7:01 am
gửi bởi Dark.Cosmos
Chép đoạn code sau vào Form, make (build) thành file exe và chạy thử sẽ thấy kết quả.

  1. Option Explicit
  2. Private Declare Function GetVersion Lib "kernel32" () As Long
  3. Private Declare Function IsAdminMode Lib "shell32" Alias "#680" () As Long
  4. 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
  5.  
  6.  
  7. Function GetVerMajor() As Long
  8.     GetVerMajor = Val(Right$(Hex$(GetVersion), 2))
  9. End Function
  10.  
  11. Sub RunMeAsAdminMode()
  12.     If (IsAdminMode = 1) Then Exit Sub
  13.     Call ShellExecuteA(0, IIf(GetVerMajor > 5, "runas", "open"), App.EXEName & ".exe", Interaction.Command$, App.Path, 10)
  14.     End
  15. End Sub
  16.  
  17. Private Sub Form_Load()
  18.     Call MsgBox("Administrator mode = " & CBool(IsAdminMode), vbInformation)
  19.     Call RunMeAsAdminMode
  20. End Sub
  21.  


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.

MakeFile_RunMe_WithAdminMode.zip
(20.87 KiB) Đã tải 273 lần

Re: Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Hai 21/12/2015 8:09 am
gửi bởi kieu manh
Mình không rành VB6 lắm...mình mô tả có gì sai bạn bỏ qua cho
Mình tải về chạy trên win10(32bit) thấy nó chạy tốt nhưng viết làm sao khi chạy nó khỏi báo yes hay No thì tốt
ý mình là nó chạy Run As administrator luôn vậy mà khỏi thông báo (User Account Control ....Yes ..No)
hay mình chưa biết xài vậy...xin cảm ơn

Re: Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Tư 23/12/2015 12:54 am
gửi bởi Dark.Cosmos
@kieu manh:
Cái đó hình như là do cấu hình user trong hđh windows (user account control settings). Nếu là máy của bạn thì bạn có thể tự cấu hình lại để nó không báo nữa. Còn nếu là máy của người dùng thì ... bạn biết rồi đó. ^^!

Re: Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Tư 23/12/2015 11:42 am
gửi bởi kieu manh
To Dark.Cosmos
Cái đó mình biết ....nếu kéo UAC xuống thì lại không xài code đó nữa vấn đề mong muốn là vẫn để UAC mức cao mà vẫn chạy được ....
Có cách nào dùng senkey cho nó chọn Yes khi hiên thông báo không bạn
cảm ơn Bạn

Re: Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Năm 31/12/2015 5:09 am
gửi bởi Dark.Cosmos
@Kieu Manh:
Nếu muốn send key thì vẫn đc chứ bạn.
Dùng hàm sendMessage, than số đầu là cán cửa sổ (handle window), tham số 2 là wm_keydown, tham số 3 là virtual key code, tham số 4 la 0.
Cũng có nhiều cách khác tương tự nữa.

Re: Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Năm 31/12/2015 1:11 pm
gửi bởi kieu manh
Cảm ơn Bạn rất nhiều ...
Mình cũng đang tập Vọc VB6... và Hàm API nên cũng không rành lắm nếu được Bạn cho một Ví dụ: Code send key....Nó chọn Yes khi hiện thông báo UAC (Change User Account Control Settings) của Win Áp dụng cho code bài 1 của Bạn Run as Administrator

Re: Chạy ứng dụng với quyền Admin (Run as Administrator)

Đã gửi: T.Năm 31/03/2016 5:05 pm
gửi bởi NTN
Cái này áp dụng cho vb.net luôn à?