thongkorn โพสต์ 2023-1-24 11:52:21

[VB6] โค้ดในการกำหนดให้ไฟล์ EXE สามารถ Run As Administrator ได้

http://www.g2gsoft.com/webboard/images/VB6/runasadmin.png

ตั้งแต่ Windows 10 มันสร้างความปลอดภัยที่สูงขึ้นมาก ทำให้ผู้ใช้ต้องมาคลิ๊กเมาส์ขวาเพื่อสั่ง Run As Administrator หรือต้องไปกำหนดในคุณสมบัติ (Properties) เพื่อตั้งค่า Compatibility ให้ Run this program as an administrator ซึ่งยุ่งยากเสียเวลาต่อผู้ใช้งาน แต่เราสามารถกำหนดสิ่งนี้ได้โดยตรงผ่านโค้ดโปรแกรม ซึ่งจะต้องใช้ WinAPI32 เพื่อทำการ Read/Write เข้าสู่ระบบ Registry อาจจะดูยากสำหรับหลายๆคนในการทำความเข้าใจ ก็ค่อยๆเรียนรู้กันไป เพราะเจ้าตัว WinAPI32 นี่แหละคือพลังอันล้ำเลิศของ VB6 แม้แต่ .Net Framework ในปัจจุบันยังต้องพึ่งพามันอยู่เลยครับ ...

[คำเตือน: อย่าลืม Make EXE ก่อนด้วยครับ]

มาดูโค้ดในส่วนฟอร์มหลัก
Option Explicit

Private Sub Form_Load()
    Call RunAsAdministrator
End Sub

'// ปรับให้ Run As Administrator
Function RunAsAdministrator()
    Dim strValue As String
    Dim strProgramName As String
    Dim SubKey As String
    SubKey = "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
    strProgramName = App.Path & "\RunAsAdmin.exe"
    '// หรือกำหนด strProgramName = "C:\ตำแหน่งโปรเจค\RunAsAdmin.exe"
    strValue = "~ RUNASADMIN"
   
    Call SetKeyDataValue(&H80000001, SubKey, 1, strProgramName, strValue)

End Function
โค้ดในส่วนของ Module
Option Explicit

'// -----------------------------------------------------------------------------------------------------
'// Windows API Declarations for Read And Write to the Registry.
'// -----------------------------------------------------------------------------------------------------
Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" ( _
    ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
    ByVal samDesired As Long, ByRef phkResult As Long) As Long

Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" ( _
    ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" ( _
    ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
    ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" ( _
    ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
    ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long

Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" ( _
    ByVal hKey As Long, ByVal lpValueName As String) As Long

Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" ( _
    ByVal hKey As Long, ByVal lpSubKey As String) As Long

Public Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long

Public Const KEY_ALL_ACCESS = &H2003F

Public Sub SetKeyDataValue(RegKeyRoot As Long, RegKeyName As String, KeyDataType As Long, KeyValueName As String, KeyValueDate As Variant)
   
    Dim OpenKey As Long, SetValue As Long, hKey As Long
   
    OpenKey = RegOpenKeyEx(RegKeyRoot, RegKeyName, 0, KEY_ALL_ACCESS, hKey)
   
    If (OpenKey <> 0) Then Call RegCreateKey(RegKeyRoot, RegKeyName, hKey)
   
    Select Case KeyDataType
      Case 1:
            SetValue = RegSetValueEx(hKey, KeyValueName, 0&, KeyDataType, ByVal CStr(KeyValueDate & Chr$(0)), Len(KeyValueDate))
      Case 3:
            SetValue = RegSetValueEx(hKey, KeyValueName, 0&, KeyDataType, ByVal CStr(KeyValueDate & Chr$(0)), Len(KeyValueDate))
      Case 4:
            SetValue = RegSetValueEx(hKey, KeyValueName, 0&, KeyDataType, CLng(KeyValueDate), 4)
    End Select
   
    SetValue = RegCloseKey(hKey)
   
End Sub
ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่ ...


หน้า: [1]
ดูในรูปแบบกติ: [VB6] โค้ดในการกำหนดให้ไฟล์ EXE สามารถ Run As Administrator ได้