У меня есть исполняемый файл Windows (whoami), который время от времени дает сбой. Он вызывается из другого процесса, чтобы получить подробную информацию о текущем пользователе и домене. Я хотел бы знать, какие параметры передаются при сбое.
Кто-нибудь знает о подходящем способе обернуть процесс и записать его аргументы командной строки в журнал, все еще вызывая процесс?
Скажем, команда используется так: 'whoami.exe / все'
Я бы хотел, чтобы вместо whoami.exe (с тем же именем файла) существовал сценарий, который запишет этот вызов в журнал, а затем передаст вызов фактическому процессу.





Вы не заметили, на каком языке программирования. Это невозможно сделать из файла .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
}
Найдите whoami.exe, BACK IT UP, замените его собственным исполняемым файлом и посмотрите, как вам нравится, с его параметрами (возможно, сохраните их в текстовом файле).
Я не думаю, что использование «скрипта» сработает, поскольку промежуточное звено должно иметь расширение .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.
Разве вы не можете просто изменить вызывающую программу, чтобы она регистрировала параметры, которые она использовала для вызова процесса, и код выхода? Это было бы проще, чем копаться в whoami.exe
Увы, я не контролирую вызывающую программу
Из командного файла:
echo Parameters: %* >> logfile.txt
whoami.exe %*
С оговоркой, что у вас могут возникнуть проблемы, если параметры содержат пробелы (и вы передали экранирование с помощью "), потому что синтаксический анализатор командной строки в основном экранирует их, и они должны быть повторно экранированы перед передачей другому исполняемому файлу.
На самом деле мне еще нужно заменить whoami.exe этой партией. Есть ли способ добиться этого?
Нет, я не думаю, что ты сможешь это сделать. Такой сценарий будет делать то, что вы хотите, но не может иметь расширение .exe.
Если вы можете воспроизвести сбой, используйте Process Explorer до того, как сбойный процесс будет завершен, чтобы увидеть его командную строку.
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Спасибо за это, меня не волнует, на каком языке он написан. В идеале я надеялся, что есть способ манипулировать пакетным сценарием, чтобы он притворился исполняемым файлом, как вы могли бы с помощью сценария оболочки, а затем выполнить перенаправление потока. Я предполагаю, что Windows ожидает, что .exes будет скомпилированным кодом.