Cách Sendkeys Sang Ứng Dụng Windows (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,129
Giới tính
Nam
Mình đang nghiên cứu hàm API một tẹo ...

Mà kẹt khi chạy với quyền Run As ...Thì nó hiện lên hộp thoại của Windows (User Account Control) nó hỏi Mình có muốn thực hiện hay không ... Nếu có thì chon Yes , Không chọn No ....

Vậy mình muốn hỏi xem có cách nào sử dụng Sendkeys chọn Yes khi chạy code... Sub ImportsReg()

Mình có làm một File *.reg giả lập để thực hiện đi kèm theo File Úp

Code áp dụng từ Win7 trở lên

Mã:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
                ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
               
Public Sub RunAdmin(ByVal FilePath As String)
    ShellExecute 0&, "", FilePath, "", "", 1
End Sub


Sub ImportsReg()
    Dim strFile As String
    strFile = ThisWorkbook.Path & "\OFF.reg"
    RunAdmin (strFile)
End Sub

File *.reg chỉ là giả lập ...còn nếu ImportsReg không Thì mình có nhiều cách Viết khác Không đụng tới Bác Bill vì vậy sẻ không bàn mục này

Xin cảm ơn
 

File đính kèm

Mình đang nghiên cứu hàm API một tẹo ...

Mà kẹt khi chạy với quyền Run As ...Thì nó hiện lên hộp thoại của Windows (User Account Control) nó hỏi Mình có muốn thực hiện hay không ... Nếu có thì chon Yes , Không chọn No ....

Vậy mình muốn hỏi xem có cách nào sử dụng Sendkeys chọn Yes khi chạy code... Sub ImportsReg()

Mình có làm một File *.reg giả lập để thực hiện đi kèm theo File Úp

Code áp dụng từ Win7 trở lên

Mã:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
                ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
               
Public Sub RunAdmin(ByVal FilePath As String)
    ShellExecute 0&, "", FilePath, "", "", 1
End Sub


Sub ImportsReg()
    Dim strFile As String
    strFile = ThisWorkbook.Path & "\OFF.reg"
    RunAdmin (strFile)
End Sub

File *.reg chỉ là giả lập ...còn nếu ImportsReg không Thì mình có nhiều cách Viết khác Không đụng tới Bác Bill vì vậy sẻ không bàn mục này

Xin cảm ơn
kieu manh có thể tham khảo bài này:
Link
 
Upvote 0
Không được cụ thể như thế nào, bạn có thể nói rõ xem mọi người có giúp được không?
chạy code mó im de có nhúc nhíc gì đâu....bạn thử chạy code mình úp lên là biết liền ...nó hiện hộp thoại windows (User Account Control)....nếu chọn Yes thì nó mở File *.reg
 
Upvote 0
chạy code mó im de có nhúc nhíc gì đâu....bạn thử chạy code mình úp lên là biết liền ...nó hiện hộp thoại windows (User Account Control)....nếu chọn Yes thì nó mở File *.reg
Có đâu nhỉ?
[GPECODE=vb]
Private Const LOGON_WITH_PROFILE As Long = &H1
Private Const LOGON_NETCREDENTIALS_ONLY = &H2
Private Const LOGON32_LOGON_INTERACTIVE = 2
Private Const LOGON32_PROVIDER_DEFAULT = 0
Private Const INFINITE As Long = &HFFFFFFFF
Private Const SW_HIDE As Long = 0
Private Const SW_MAX As Long = 10
Private Const STARTF_USESHOWWINDOW As Long = &H1
Private Const STARTF_USESTDHANDLES As Long = &H100
Private Const SWP_HIDEWINDOW As Long = &H80
Private Const SW_MINIMIZE As Long = 6
Private Const HIDE_WINDOW As Long = 0






Private Type STARTUPINFOW
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type


Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type


Private Declare Function CreateProcessWithLogonW Lib "advapi32" (ByVal UserName As String, _
ByVal Domain As String, ByVal Password As String, ByVal dwLogonFlags As Long, _
ByVal ApplicationName As String, ByVal strCommandLine As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal strCurrentDirectory As Long, ByRef lpStartupInfo As STARTUPINFOW, _
ByRef lppiProcessInfo As PROCESS_INFORMATION) As Long

Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long


Public Function RunAsUser(ByVal UserName As String, ByVal Password As String, _
ByVal DomainName As String, AppName As String, ComLine As String, Optional ByVal Wait As Boolean = False) As Long


Dim si As STARTUPINFOW
Dim pi As PROCESS_INFORMATION

Dim wUser As String
Dim wDomain As String
Dim wPassword As String
Dim wAppName As String
Dim Result As Long

si.cb = Len(si)
si.wShowWindow = HIDE_WINDOW
'si.wShowWindow = SW_MAX
wUser = StrConv(UserName & Chr(0), vbUnicode)
wDomain = StrConv(DomainName & Chr(0), vbUnicode)
wPassword = StrConv(Password & Chr(0), vbUnicode)
wAppName = StrConv(AppName & Chr(0), vbUnicode)

Result = CreateProcessWithLogonW(wUser, wDomain, wPassword, _
LOGON_WITH_PROFILE, wAppName, StrPtr(ComLine), 0, 0, 0, si, pi)
If Result <> 0 Then ' thanh cong
' neu Wait TRUE thi code dung o dong WaitForSingleObject cho toi khi process cua wAppName ket thuc
' sau do moi chay tiep code CloseHandle pi.hThread
If Wait Then WaitForSingleObject pi.hProcess, INFINITE
CloseHandle pi.hThread
CloseHandle pi.hProcess
RunAsUser = 0
Else
' that bai
RunAsUser = Err.LastDllError
MsgBox "CreateProcessWithLogonW that bai " & Err.LastDllError, vbExclamation
End If


End Function

'Sub ImportsReg()
Dim strFile As String
strFile = ThisWorkbook.Path & "\\OFF.reg"
RunAsUser "Administrator", "password", "DomainName hoặc Computer Name", "cmd.exe", " /k" & strFile
End Sub
[/GPECODE]
Nó chỉ hiện bảng có add registry không thôi, có hiện admin gì đâu nhỉ?
 
Upvote 0
Hoặc có thể kieu manh kiểm tra cài đặt UAC xem. Nếu không ở chế độ Never notify thì set lại xem.
Có thể dùng thêm lệnh này để cài đặt UAC:
Mã:
RunAsUser "Administrator", "password", "DomainName", "cmd.exe", " /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d " & Mycommand & " /f"
Với Mycommand nhận giá trị 0 hoặc 1
 
Upvote 0
Có đâu nhỉ?
[GPECODE=vb]
Private Const LOGON_WITH_PROFILE As Long = &H1
Private Const LOGON_NETCREDENTIALS_ONLY = &H2
Private Const LOGON32_LOGON_INTERACTIVE = 2
Private Const LOGON32_PROVIDER_DEFAULT = 0
Private Const INFINITE As Long = &HFFFFFFFF
Private Const SW_HIDE As Long = 0
Private Const SW_MAX As Long = 10
Private Const STARTF_USESHOWWINDOW As Long = &H1
Private Const STARTF_USESTDHANDLES As Long = &H100
Private Const SWP_HIDEWINDOW As Long = &H80
Private Const SW_MINIMIZE As Long = 6
Private Const HIDE_WINDOW As Long = 0






Private Type STARTUPINFOW
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type


Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type


Private Declare Function CreateProcessWithLogonW Lib "advapi32" (ByVal UserName As String, _
ByVal Domain As String, ByVal Password As String, ByVal dwLogonFlags As Long, _
ByVal ApplicationName As String, ByVal strCommandLine As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal strCurrentDirectory As Long, ByRef lpStartupInfo As STARTUPINFOW, _
ByRef lppiProcessInfo As PROCESS_INFORMATION) As Long

Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long


Public Function RunAsUser(ByVal UserName As String, ByVal Password As String, _
ByVal DomainName As String, AppName As String, ComLine As String, Optional ByVal Wait As Boolean = False) As Long


Dim si As STARTUPINFOW
Dim pi As PROCESS_INFORMATION

Dim wUser As String
Dim wDomain As String
Dim wPassword As String
Dim wAppName As String
Dim Result As Long

si.cb = Len(si)
si.wShowWindow = HIDE_WINDOW
'si.wShowWindow = SW_MAX
wUser = StrConv(UserName & Chr(0), vbUnicode)
wDomain = StrConv(DomainName & Chr(0), vbUnicode)
wPassword = StrConv(Password & Chr(0), vbUnicode)
wAppName = StrConv(AppName & Chr(0), vbUnicode)

Result = CreateProcessWithLogonW(wUser, wDomain, wPassword, _
LOGON_WITH_PROFILE, wAppName, StrPtr(ComLine), 0, 0, 0, si, pi)
If Result <> 0 Then ' thanh cong
' neu Wait TRUE thi code dung o dong WaitForSingleObject cho toi khi process cua wAppName ket thuc
' sau do moi chay tiep code CloseHandle pi.hThread
If Wait Then WaitForSingleObject pi.hProcess, INFINITE
CloseHandle pi.hThread
CloseHandle pi.hProcess
RunAsUser = 0
Else
' that bai
RunAsUser = Err.LastDllError
MsgBox "CreateProcessWithLogonW that bai " & Err.LastDllError, vbExclamation
End If


End Function

'Sub ImportsReg()
Dim strFile As String
strFile = ThisWorkbook.Path & "\\OFF.reg"
RunAsUser "Administrator", "password", "DomainName hoặc Computer Name", "cmd.exe", " /k" & strFile
End Sub
[/GPECODE]
Nó chỉ hiện bảng có add registry không thôi, có hiện admin gì đâu nhỉ?
chạy nó báo lỗi theo hình
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    16.4 KB · Đọc: 26
Upvote 0
Hoặc có thể kieu manh kiểm tra cài đặt UAC xem. Nếu không ở chế độ Never notify thì set lại xem.
Có thể dùng thêm lệnh này để cài đặt UAC:
Mã:
RunAsUser "Administrator", "password", "DomainName", "cmd.exe", " /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d " & Mycommand & " /f"
Với Mycommand nhận giá trị 0 hoặc 1
Tại UAC đang ON nên mới nghĩ tới API xem sao đó mà ... nếu Set UAC off thì lại không có vấn đề gì....

Ý muốn UAC vẫn ON mà Run As xong dùng Sendkeys Chon Yes Khi nó hiện thông báo ấy
 
Upvote 0
Tại UAC đang ON nên mới nghĩ tới API xem sao đó mà ... nếu Set UAC off thì lại không có vấn đề gì....

Ý muốn UAC vẫn ON mà Run As xong dùng Sendkeys Chon Yes Khi nó hiện thông báo ấy
Có rất nhiều cách để chạy một ứng dụng với quyền admin, đồng thời cách để xử lý tình huống với sendkey.
Trong trường hợp này, kieu manh có thể nghĩ theo phương án khác
Ví dụ:
File excel chạy 1 file runas.vbs, nhiệm vụ của file runas.vbs này để chạy file off.reg với quyền admin.
code của file runas.vbs có thể như sau:
[gpecode=vb]
Option explicit
Dim oShell
dim sPath
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "runas /user:administrator cmd"
WScript.Sleep 1000
oShell.Sendkeys "password~"
WScript.Sleep 500
sPath=oShell.CurrentDirectory & "\off.reg"
oShell.Sendkeys sPath & "~"
WScript.Sleep 500
oShell.Sendkeys "~"
Wscript.Quit
[/gpecode]
(file off.reg lưu cùng nơi với file runas.vbs)
Việc chạy file runas.vbs bằng excel cũng như tạo file runas.vbs có lẽ không cần phải chi tiết kieu manh ^^?
 
Upvote 0
Có rất nhiều cách để chạy một ứng dụng với quyền admin, đồng thời cách để xử lý tình huống với sendkey.
Trong trường hợp này, kieu manh có thể nghĩ theo phương án khác
Ví dụ:
File excel chạy 1 file runas.vbs, nhiệm vụ của file runas.vbs này để chạy file off.reg với quyền admin.
code của file runas.vbs có thể như sau:
[gpecode=vb]
Option explicit
Dim oShell
dim sPath
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "runas /user:administrator cmd"
WScript.Sleep 1000
oShell.Sendkeys "password~"
WScript.Sleep 500
sPath=oShell.CurrentDirectory & "\off.reg"
oShell.Sendkeys sPath & "~"
WScript.Sleep 500
oShell.Sendkeys "~"
Wscript.Quit
[/gpecode]
(file off.reg lưu cùng nơi với file runas.vbs)
Việc chạy file runas.vbs bằng excel cũng như tạo file runas.vbs có lẽ không cần phải chi tiết kieu manh ^^?
Không biết bạn thử chạy code trên với File *.vbs chưa nó nhảy linh tinh đó....Cảm ơn Bạn
Mình chỉ mong bằng Code chạy trên Excel ....từ đó mình có thể Viết một ứng dụng mà trên máy người dùng từ win7 trở lên cho dù UAC có ON hay OFF thì nó cũng tự động chạy luôn ....

đó là mục đích mong muốn của mình
 
Upvote 0
Không biết bạn thử chạy code trên với File *.vbs chưa nó nhảy linh tinh đó....Cảm ơn Bạn
Mình chỉ mong bằng Code chạy trên Excel ....từ đó mình có thể Viết một ứng dụng mà trên máy người dùng từ win7 trở lên cho dù UAC có ON hay OFF thì nó cũng tự động chạy luôn ....

đó là mục đích mong muốn của mình
Chạy lung tung là ntn? Nếu bạn hay dùng cmd thì nhớ phải tắt Tiếng Việt đi đó.
Việc can thiệp sâu vào hệ thống luôn đòi hỏi phải có quyền admin. Cách đơn giản là hướng dẫn người dùng cài đặt những thứ mình muốn bằng quyền admin.
Việc trao cho user thông thường sử dụng ứng dụng các khả năng tự truy cập vào hệ thống quyền admin (mà là file excel, tính bảo mật kém) không phải là một ý tưởng hay.
Tôi vẫn thường dùng excel + file vbs + file bat + file cmd để tự động hóa một số thao tác của mình trên PC (thường cho mục đích cá nhân).
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom