3

我正在使用下面的代码在 cmd 中执行我的命令。这实际上是为在我的服务器上运行 exe 而设计的。

Private Sub Command1_Click()
    Dim FN As Integer
    FN = FreeFile
    'DOS COMMANDS
    ServerName = "\\mydbserv"
    ExePath = """d:\myfolder\my.exe"""
    UserName = "myserver\myuser"
    Password = "mypass"
    MyCommand = "psexec " & ServerName & " -u " & UserName & " -p " & Password & " -i " & ExePath
    'Open Bat file
    Open "C:\Mybatc.bat" For Output As #FN
        Print #FN, "cd c:\Users\myuser"
        Print #FN, MyCommand
        Print #FN, "Exit"
    Close #FN
    'Activate
    result = Shell("C:\Mybatc.bat", vbHide)
    End
End Sub

一切都很好,直到我看到进程完成后 cmd 没有关闭。更糟糕的是我试图远程运行的 exe 也没有停止。当我检查 CPU 使用情况时,它总是显示“00”甚至没有启动。它显示出永远工作但实际上从来没有工作过。所以我的问题是:

  1. 为什么我不能远程运行这个exe文件?(或者为什么它就像跑步一样)
  2. 在服务器上完成此 exe 文件后,如何远程运行和关闭?
  3. 在我的电脑上完成后如何关闭窗口和处理?
4

2 回答 2

3

PSExec 只会在计算机中启动进程(大部分时间是远程的),之后它无法控制正在执行的 exe。请尝试将其作为进程运行(在 C# 中的 ProcessInfo 中)(shell 执行为 false)。也可以使用以下内容来确认远程 PC 中的进程状态:

Option Explicit

Private Sub Form_Load()

    Dim strComputer As String
    Dim sReturn As String
    Dim strNameOfUser As Variant
    Dim colProcesses As Object
    Dim objProcess As Object
    strComputer = "." '"." local or "\\ComputerName"
    Set colProcesses = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").ExecQuery("Select * from Win32_Process")
    For Each objProcess In colProcesses
        sReturn = objProcess.GetOwner(strNameOfUser)
        If sReturn <> 0 Then
            MsgBox "Could not get owner info for process " & objProcess.Name & vbNewLine & "Error = " & sReturn
        Else
            MsgBox "Process " & objProcess.Name & " is owned by " & "\" & strNameOfUser & "."
        End If
    Next

End Sub

链接:http ://www.vbforums.com/showthread.php?355203-RESOLVED-How-to-get-process-information 希望对您有所帮助

于 2012-12-02T10:10:43.940 回答
3

这个怎么样?

  1. 在服务器上安装 Windbg。
  2. 当您的 exe 准备好运行时,配置 windbg 自动附加到您的 exe。 http://ask.brothersoft.com/image-file-execution-options-debugger-83827.html
  3. 运行你的脚本
  4. 启动 exe 后,windbg 将附加到它。
  5. 在windbg命令中输入'g',让你的exe运行。
  6. 等到你认为它应该完成
  7. ctrl-break 让进程挂起
  8. 向windbg 命令输入'~*kb',查看每个线程中发生了什么,找出它们等待的原因,以及它们在等待什么?
于 2012-12-03T16:22:41.887 回答