Оберните исполняемый файл для диагностики его вызовов - PullRequest
2 голосов
/ 22 сентября 2008

У меня есть исполняемый файл Windows (whoami), который часто падает. Он вызывается из другого процесса для получения сведений о текущем пользователе и домене. Я хотел бы знать, какие параметры передаются при сбое.

Кто-нибудь знает о подходящем способе обернуть процесс и записать его аргументы командной строки для регистрации, все еще вызывая процесс?

Скажите, что команда используется так: 'whoami.exe / all'

Я бы хотел, чтобы вместо whoami.exe (с тем же именем файла) существовал сценарий, который запишет этот вызов в журнал, а затем передаст вызов реальному процессу.

Ответы [ 6 ]

1 голос
/ 22 сентября 2008

Из пакетного файла:

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

С предупреждением, что у вас могут возникнуть проблемы, если параметры содержат пробелы (и вы передали их через "), потому что синтаксический анализатор командной строки в основном де-экранирует их, и они должны быть повторно экранированы перед передачей другому исполняемый файл.

1 голос
/ 22 сентября 2008

Разве вы не можете просто изменить вызывающую программу для регистрации параметров, которые она использовала для вызова процесса, и кода выхода? Это было бы намного проще, чем копаться в whoami.exe

1 голос
/ 22 сентября 2008

Я не думаю, что использование «скрипта» будет работать, так как промежуточный должен иметь расширение .exe для вашей уловки.

Я бы написал очень маленькую программу командной строки для этого; что-то вроде следующего (написано на 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.
1 голос
/ 22 сентября 2008

Вы не заметили, какой язык программирования. Это не выполнимо из файла .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
}
0 голосов
/ 22 сентября 2008

Если вы можете воспроизвести сбой, используйте Process Explorer до завершения сбойного процесса, чтобы увидеть его командную строку.

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

0 голосов
/ 22 сентября 2008

Найдите whoami.exe, BACK IT UP, замените его на свой собственный исполняемый файл и посмотрите, делайте все что угодно с его параметрами (возможно, сохраните их в текстовом файле).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...