`

如何截获执行命令行的输出

 
阅读更多
Option Explicit
Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
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 Long
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 CreateProcessAsUser Lib "advapi32.dll" Alias "CreateProcessAsUserA" (ByVal hToken As Long, ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As SECURITY_ATTRIBUTES, ByVal lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As String, ByVal lpCurrentDirectory As String, ByVal lpStartupInfo As STARTUPINFO, ByVal lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const STARTF_USESTDHANDLES = &H100
Private Const STARTF_USESHOWWINDOW = &H1
Private Function ExecuteCommandLineOutput(CommandLine As String, Optional BufferSize As Long = 256, Optional TimeOut As Long) As String
Dim Proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Dim SA As SECURITY_ATTRIBUTES
Dim hReadPipe As Long
Dim hWritePipe As Long
Dim lBytesRead As Long
Dim sBuffer As String
If VBA.Len(CommandLine) > 0 Then
SA.nLength = Len(SA)
'SA.nLength = vba.Len(sa)
SA.bInheritHandle = 1&
SA.lpSecurityDescriptor = 0&
If CreatePipe(hReadPipe, hWritePipe, SA, 0) > 0 Then
Start.cb = Len(Start)
Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
Start.hStdOutput = hWritePipe
Start.hStdError = hWritePipe
If CreateProcessA(0&, CommandLine, SA, SA, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc) = 1 Then
CloseHandle hWritePipe
sBuffer = VBA.String(BufferSize, VBA.Chr(0))
If TimeOut > 0 Then
Dim BeginTime As Date
BeginTime = VBA.Now
End If
Do Until ReadFile(hReadPipe, sBuffer, BufferSize, lBytesRead, 0&) = 0
DoEvents
If TimeOut > 0 Then
If VBA.DateDiff("s", BeginTime, VBA.Now) > TimeOut Then
ExecuteCommandLineOutput = "Timeout"
Exit Do
End If
End If
ExecuteCommandLineOutput = ExecuteCommandLineOutput & VBA.Left(sBuffer, lBytesRead)
Loop
CloseHandle Proc.hProcess
CloseHandle Proc.hThread
CloseHandle hReadPipe
Else
ExecuteCommandLineOutput = "File or command not found"
End If
Else
ExecuteCommandLineOutput = "CreatePipe failed. Error: " & Err.LastDllError & "."
End If
End If
End Function
Private Sub Command1_Click() '测试
'VBA.MsgBox ExecuteCommandLineOutput("ping www.sina.com.cn")
VBA.MsgBox ExecuteCommandLineOutput("ping www.xxxx.com.cn", , 2)
End Sub
分享到:
评论

相关推荐

    VB中截获shell程序的输出_转发

    例如,你可以创建一个自定义的IDE,当用户点击“编译”按钮时,IDE在后台调用编译器,然后解析编译器的输出,提供错误提示和警告信息,而无需用户直接与命令行界面交互。这种做法提高了用户体验,使得程序的输出更...

    问题解答20211

    为了避免这种情况,需要在自定义的截获函数中检测重入,并在发现重入时直接调用原始API,而不是执行额外的操作。 在编译问题方面,确保正确设置了编译目标(通常是x86),并添加了对应的库和头文件路径。如果你的...

    25大软件编程错误不可赦

    为了避免这种情况,应该对所有输出到前端的内容进行适当的编码,以防止浏览器将其解释为可执行代码。例如,在向HTML文档插入动态生成的内容时,可以使用`htmlspecialchars()`函数进行转义处理。 #### 3. 维持SQL...

    c语言编的文件加密程序

    - 程序接受三个命令行参数:输入文件名、密码、输出文件名。若参数不足,则通过交互方式获取这些信息。 2. **加密/解密函数`add_file`**: - 此函数接收三个参数:输入文件名、密码、输出文件名。 - 打开输入...

    东师21春《操作系统》在线作业2_2参考答案.docx

    这种接口允许用户通过命令行界面与操作系统交互,执行各种任务。 #### 11. 防御被动攻击的方法 - **数据加密**: 是对抗被动攻击的有效手段之一。通过对传输的数据进行加密,即使攻击者能够截获数据,也无法解读其中...

    snort源码分析,网上找的,适合新手,教你如何在WINDOWS环境下编译运行

    在Windows环境下,可能需要借助MinGW或者Cygwin这样的工具集来提供Linux命令行环境和编译工具链。 **二、数据截获接口** 在第三章《打开数据截获接口》中,Snort使用libpcap库来捕获网络数据包。在Windows上,需要...

    telnet配置使用

    Telnet是一种用于远程登录的协议,它允许用户通过网络连接到远程计算机上,并且能够执行命令行操作。Telnet使用客户端/服务器模式,在Linux系统中,通常需要安装特定的服务端程序来支持Telnet功能。 #### 二、Linux...

    snort源码分析1

    - **命令行参数处理**:由于Snort采用了命令行界面,因此需要解析用户输入的命令行参数以执行相应的操作。 - **标志变量设置**:初始化各种标志变量,以便在后续的系统运行过程中正确地控制程序流。 #### 四、Snort...

    dotnet-使用PowerShellSecureString通过TCP反向加密AES256位Shell

    在.NET开发领域,CLI(命令行接口)工具是开发者日常工作中不可或缺的一部分,它们提供了一种高效的方式来执行自动化任务和管理操作系统。在这个特定的场景中,我们关注的是如何使用PowerShell的SecureString特性来...

    telnet.rar telnet 协议 客户端 源代码 java

    服务器接收并处理这些信息,如果认证成功,会将命令行提示符返回给客户端。 3. 交互操作:用户在客户端输入的命令会被转发到服务器,服务器执行命令并返回结果,这个过程会持续到用户断开连接或者服务器关闭连接。 4...

    Telnet服务端.rar

    这可能涉及到对命令行参数的解析,以及调用操作系统API执行命令。 5. **错误处理**:在处理过程中,可能会遇到各种异常情况,如网络中断、命令错误等,因此,良好的错误处理机制是必要的,易语言提供了丰富的异常...

    sqlmap使用手册

    4. **分析输出**: 分析SQLMap的输出结果,理解其如何判断注入点,以及如何进行下一步操作。 5. **深入源码**: 阅读`cipher.cpp`等源代码,了解其加密算法和通信过程,有助于深入理解工具的工作机制。 6. **结合...

    emc_Clariion

    SSH提供了一种加密的安全通信方式,确保在传输敏感的管理命令时数据不被截获。这个工具的一大优点是它独立安装,不需要额外的软件包依赖,这简化了部署过程,使得在各种环境中使用更为方便。 在提供的文件列表中,...

    openSSH SSH Secure Shell

    1. **ssh**:这是主要的命令行工具,用于连接到远程服务器并执行命令。 2. **scp**:安全复制命令,用于在本地和远程系统之间安全地复制文件。 3. **sftp**:安全文件传输协议客户端,提供了图形化的文件传输界面。 ...

    mysql-8.0.25-winx64 (无需积分需要自取)

    - 安装完成后,可以通过命令行工具`mysqld.exe`启动和停止MySQL服务。 4. **安全管理**: - 为了确保数据库安全,应定期更改root用户的密码,并限制远程访问权限。 - 应启用SSL连接以加密数据传输,防止数据在...

    simple-totp:简单的TOTP CLI

    - 命令行参数处理:Python的`argparse`模块可以帮助我们处理命令行参数,比如解析服务名、执行不同的操作等。 - 输出格式化:可能用到`click`库来提供友好的命令行交互体验,或者直接使用Python的`print`函数来输出...

    fiddler基础文档

    开发者或测试工程师可以通过Fiddler来监视、设置断点并修改输入输出数据。这款工具内含一个强大的基于事件的脚本子系统,并支持.NET语言进行扩展。 #### 二、Fiddler工作原理 Fiddler作为代理服务器工作,监听本地...

    使用https加密渗透实验

    在Kali Linux上使用`msfconsole`命令行工具开启Meterpreter监听器,准备接收来自靶机的连接。 ```bash msfconsole -x "use exploit/multi/handler; set PAYLOAD windows/x64/meterpreter/reverse_https; set LHOST ...

    常用的60招电脑操作精典秘籍.txt

    39. **命令行参数传递:** 在运行应用程序或脚本时,可以通过在命令行中添加参数来传递特定的配置信息或执行选项,例如`c:>dir "windows*"`用于列出包含“windows”的所有文件和文件夹。 以上技巧涵盖了从日常操作...

Global site tag (gtag.js) - Google Analytics