2016-05-13 2 views
2

Интересно, может ли кто-нибудь помочь мне понять, почему мой Process не работает и не генерирует ошибку.C# System.Diagnostics.Process не делает ничего или не делает ошибку

Код, приведенный ниже, должен проходить через каталог, находить все файлы с расширением sqb и для каждого файла запускать Process в качестве учетной записи пользователя, которая имеет повышенные привилегии на сервере.

Процесс должен запускать исполняемый файл sqb2mtf.exe из той же папки, в которой находятся файлы, например, sqb2mtf.exe file.sqb file.bak.

Если я использую Visual Studio 2013 и прохожу через код, я вижу, что каждый файл зацикливается, и появляется сообщение Process, но файлы не преобразуются, и никаких ошибок, представленных переменной readToEndError.

var directory = new DirectoryInfo(@"D:\inetpub\Import\"); 

foreach (var file in directory .EnumerateFiles("*.sqb")) 
{ 
    var convert = Path.GetFileNameWithoutExtension(file.ToString()); 

    var process = new Process 
    { 
     StartInfo = 
     { 
      CreateNoWindow = true, 
      UseShellExecute = false, 
      RedirectStandardOutput = true, 
      RedirectStandardInput = true, 
      RedirectStandardError = true, 
      FileName = @"D:\inetpub\Import\sqb2mtf.exe", 
      UserName = "myUserName", 
      Domain = "myDomain", 
      Password = GetSecureString("myPassword"), 
      Arguments = @"D:\inetpub\Import\" + file + " " + @"D:\inetpub\Import\" + convert + ".bak" 
     } 
    }; 
    process.Start(); 

    string readToEndOutput = process.StandardOutput.ReadToEnd(); 
    string readToEndError = process.StandardError.ReadToEnd(); 

    process.WaitForExit(); 

} 

Я схожу ума, любой совет, чтобы решить это было бы оценено :-)

Update

var directoryInfo = new DirectoryInfo(BackupDirectory); 

foreach (var file in directoryInfo.EnumerateFiles("*.sqb")) 
{ 
    var convert = Path.GetFileNameWithoutExtension(file.ToString()); 

    var fileName = BackupDirectory + "sqb2mtf.exe"; 

    var arguments = "\"" + BackupDirectory + file + "\" \"" + BackupDirectory + convert + ".bak\""; 

    var process = new Process 
    { 
     StartInfo = 
     { 
      CreateNoWindow = true, 
      UseShellExecute = true, 
      RedirectStandardOutput = false, 
      RedirectStandardInput = false, 
      RedirectStandardError = false, 
      FileName = fileName, 
      Arguments = arguments 
     } 
    }; 
    process.Start(); 
    process.WaitForExit(); 

    file.Delete(); 
} 

Одна вещь, опираясь на от комментариев по InBetween это необходимость кавычек, в этом случае кавычки должны окружать два отдельных файла.

Я могу подтвердить, что этот код действительно работает на IISExpress, выдавая себя за другого пользователя, к сожалению, просто не IIS 7.5.

Рабочий стол должен был переместить этот код в консольное приложение и установить его на соответствующий сервер, а затем использовать задачу расписания Windows для запуска в качестве конкретной учетной записи.

+0

Проверка работоспособности: Работает ли она при запуске команды из 'cmd'? 'stdout' тоже пуст? Возвращает ли процесс код выхода 0 или что-то еще? Если все это хорошо проверяется, у вас должны быть некоторые проблемы с 'UserName',' Domain' или 'Password'. –

+0

Попробуйте установить CreateNoWindow = false, чтобы вы могли видеть, что происходит, когда exe запускается. Это может быть ошибка или сообщение, которое вы можете увидеть в прошлом. После того, как вы это сделаете, вы можете скрыть окно. –

+0

Если я установил CreateNoWindow в false, я не получу окно, если я пропущу имя пользователя, я получаю сообщение об ошибке «Ошибка входа в систему: неизвестное имя пользователя или неверный пароль», поэтому я бы предположил, что правильно или неправильно, если я не получу эту ошибку домен, имя пользователя и пароль работают правильно. – iggyweb

ответ

1

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

Не уверен, если это проблема, но это стоит попробовать:

Arguments = "\"D:\\inetpub\\Import\\" + file + " D:\\inetpub\\Import\\" + convert + ".bak\""; 

Тем не менее, кажется странным, что этот процесс будет просто умереть молча. Я бы дважды уточнил Domain, UserName и Password.

+0

Спасибо, я пробовал обернуть Аргументы в кавычки, но до сих пор нет радости. Если я пропущу имя пользователя или пароль, я получаю сообщение об ошибке, но не тогда, когда все детали верны. – iggyweb

+0

Я пропустил внутренние кавычки, поэтому 'var arguments =" \ "" + BackupDirectory + file + "\" \ "" + BackupDirectory + convert + ".bak \ ""; 'работал, но только на IISExpress. – iggyweb

Смежные вопросы