包装可执行文件以诊断它的调用

时间:2008-09-22 10:36:19

标签: windows scripting

我有一个Windows可执行文件(whoami),它经常崩溃。它从另一个进程调用以获取有关当前用户和域的详细信息。我想知道失败时传递的参数。

有没有人知道一个合适的方法来包装进程并将其命令行参数写入日志,同时仍然调用进程?

假设命令使用如下: 'whoami.exe / all'

我想要一个脚本存在而不是whoami.exe(具有相同的文件名),它会将此调用写入日志,然后将调用传递给实际进程。

6 个答案:

答案 0 :(得分:1)

您没有注意到哪种编程语言。如果这是您想要的,那么从.bat文件中无法实现,但您可以使用任何编程语言进行操作。 C中的示例:

int main(int argc, void **argv)
{
    // dump contents of argv to some log file
    int i=0;
    for (i=0; i<argc; i++)
        printf("Argument #%d: %s\n", argv[i]);
    // run the 'real' program, giving it the rest of argv vector (1+)
    // for example spawn, exec or system() functions can do it
    return 0; // or you can do a blocking call, and pick the return value from the program
}

答案 1 :(得分:1)

我不认为使用“脚本”会起作用,因为中间件应该有一个.exe扩展名,以便你的ploy工作。

我会编写一个非常小的命令行程序来执行此操作;类似于以下内容(用Delphi / Virtual Pascal编写,因此它将生成Win32可执行文件,但任何编译语言都应该这样做):

program PassThrough;

uses
  Dos; // Imports the Exec routine

const
  PassTo = 'Original.exe'; // The program you really want to call

var 
  CommandLine: String;
  i: Integer;
  f: Text;

begin
  CommandLine := '';
  for i := 1 to ParamCount do
    CommandLine := CommandLine + ParamStr(i) + ' ';

  Assign(f,'Passthrough.log');
  Append(f);
  Writeln(f, CommandLine);      // Write a line in the log
  Close(f);


  Exec(PassTo, CommandLine);    // Run the intended program
end.

答案 2 :(得分:1)

您是否只能更改调用程序以记录用于调用进程的参数和退出代码? 这比试图挖掘whoami.exe更容易

答案 3 :(得分:1)

从批处理文件:

echo Parameters: %* >> logfile.txt
whoami.exe %*

有一点需要注意,如果参数包含空格,你可能会遇到问题(并且你使用了'),因为命令行解析器基本上解除了它们的转义,它们应该在传递给另一个之前重新转义可执行文件。

答案 4 :(得分:0)

查找whoami.exe,BACK IT UP,将其替换为您自己的可执行文件,并使用它的参数查看您喜欢的任何内容(可能将它们保存在文本文件中)。

答案 5 :(得分:0)

如果可以重现崩溃,请在崩溃进程终止之前使用Process Explorer查看其命令行。

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx