Запуск командного файла со страницы ASP.Net

Я пытаюсь запустить командный файл на сервере через страницу ASP.Net, и это сводит меня с ума. Когда я запускаю приведенный ниже код, ничего не радует - по некоторым операторам журнала я вижу, что этот код выполняется, но файл.bat, который я передаю функции, никогда не запускается.

Может кто-нибудь сказать мне, что я делаю не так?

public void ExecuteCommand(string batchFileLocation)
{
   Process p = new Process();

   // Create secure password
   string prePassword = "myadminpwd";
   SecureString passwordSecure = new SecureString();
   char[] passwordChars = prePassword.ToCharArray();
   foreach (char c in passwordChars)
   {
       passwordSecure.AppendChar(c);
   }

   // Set up the parameters to the process
   p.StartInfo.FileName = @"C:\\Windows\\System32\cmd.exe";
   p.StartInfo.Arguments = @" /C " + batchFileLocation;
   p.StartInfo.LoadUserProfile = true;
   p.StartInfo.UserName = "admin";
   p.StartInfo.Password = passwordSecure;
   p.StartInfo.UseShellExecute = false;
   p.StartInfo.CreateNoWindow = true;

   // Run the process and wait for it to complete
   p.Start();
   p.WaitForExit();
}

В журнале просмотра приложений "Application" на сервере каждый раз, когда я пытаюсь запустить это, возникает следующая проблема:

Неисправное приложение cmd.exe, версия 6.0.6001.18000, отметка времени 0x47918bde, неисправный модуль kernel32.dll, версия 6.0.6001.18000, отметка времени 0x4791a7a6, код исключения 0xc0000142, смещение ошибки 0x00009cac, идентификатор процесса 0x8bc, время запуска приложения 0x01cc0a67825eda4.

ОБНОВИТЬ

Следующий код работает нормально (он запускает пакетный файл):

Process p = new Process();
p.StartInfo.FileName = batchFileLocation;
p.StartInfo.WorkingDirectory = Path.GetDirectoryName(batchFileLocation);
p.StartInfo.UseShellExecute = false;

// Run the process and wait for it to complete
p.Start();
p.WaitForExit();

Это, однако, не (когда я пытаюсь запустить от имени определенного пользователя):

Process p = new Process();

// Create secure password
string prePassword = "adminpassword";
SecureString passwordSecure = new SecureString();
char[] passwordChars = prePassword.ToCharArray();
foreach (char c in passwordChars)
{
      passwordSecure.AppendChar(c);
}

p.StartInfo.FileName = batchFileLocation;
p.StartInfo.WorkingDirectory = Path.GetDirectoryName(batchFileLocation);
p.StartInfo.UseShellExecute = false;
p.StartInfo.UserName = "admin";
p.StartInfo.Password = passwordSecure;

// Run the process and wait for it to complete
p.Start();
p.WaitForExit();

2 ответа

Решение

Небольшой гугл на "Faulting application cmd.exe" указывает мне на этот форум IIS.

Кажется, что вы не можете создать новый процесс в фоновом режиме под IIS, если вы не используете метод CreateProcessWithLogon. (Я не проверял это).

Просто вызовите пакетный файл напрямую:

p.StartInfo.FileName = batchFileLocation;

Кроме того, убедитесь, что WorkingDirectory установлен в правильном месте:

p.StartInfo.WorkingDirectory= Path.GetDirectoryName(batchFileLocation);
Другие вопросы по тегам