Почему «cmd.exe / C команда» не заканчивается при вызове через Process.Start ()? - PullRequest
7 голосов
/ 28 января 2011

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

            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();

            startInfo.FileName = "cmd.exe";
            startInfo.Arguments = "/C " +command;
            startInfo.UserName = "myuser";
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.Domain = "mydomain";
            startInfo.CreateNoWindow = true;

            String pass = "mypass";
            System.Security.SecureString secPass = new System.Security.SecureString();

            foreach (char c in pass.ToCharArray())
            {
                secPass.AppendChar(c);
            }
            secPass.MakeReadOnly();

            startInfo.Password = secPass;

            process.StartInfo = startInfo;
            process.Start();
            //output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            process.Close();

Я пробовал как с чтением, так и без негостандартный вывод.

Приложение будет зависать на process.WaitForExit();, пока я не завершу процесс через диспетчер задач.

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Я думаю, нам нужно понять, какие команды вы на самом деле пытаетесь обработать, чтобы определить, что происходит.Также нам нужно знать, на какой ОС работает сервер.

Например, я видел в ваших комментариях, где вы пробовали «echo test> C: \ test.txt» под Windows Server 2008 (и Windows 7)Корневой каталог требует прав администратора для создания файлов.Если это выполняется в IIS, я предполагаю, что ваш пользователь IIS не является администратором, и вы получаете исключения безопасности.

Кроме того, для ряда команд могут потребоваться повышенные привилегии из-за UAC.Я точно не помню, но я предполагаю, что если эти команды перехватываются UAC, то процесс ожидает подтверждения UAC ... Что, как я считаю , вы не можете передать через командную строку.

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

Итак, самое первое, что вам нужно сделать, это выяснить, что именно вы пытаетесь запустить, и посмотреть, может ли пользователь, под которым выполняется рабочий процесс, даже выполнить эти действия.Безопасность призвана защитить вас, поэтому будьте осторожны с предоставлением пользователю дополнительных разрешений.

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

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

Вы можете просмотреть журналы событий компьютеров, чтобы узнать, не было ли выдано каких-либо предупреждений или ошибок об этой команде.Иногда такие вещи могут появляться там, чтобы дать вам немного больше информации о том, что произошло.

2 голосов
/ 28 января 2011

После передачи в CMD управление переходит в оболочку. Лучше добавить это так:

private void closeSubProcess()
    {
        Process[] currentProcesses = Process.GetProcesses();
        foreach (Process p in currentProcesses)
        {
            string s = p.ProcessName;
            s = s.ToLower();
            if (s.CompareTo("YOURPROGRAMNAMEHERE") == 0)
            {
                p.CloseMainWindow();
                p.Close();
            }
        }
    }
0 голосов
/ 18 июня 2015

Я вызываю cmd.exe для запуска модуля узла в Windows.Очевидно, что сначала нужно установить npm вместе с нужным мне модулем узла, а затем я могу вызвать модуль с аргументами в C #.Проблема была в том, что cmd.exe не закрывался, мне пришлось бы использовать Task Mgr (как этот вопрос!).

        //This requires npm, and the module installed by npm...
        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = "cmd.exe";
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = true; //closes command window
        psi.Arguments = "/c <nodemodulename>" + file1 + ".txt " + file2 + ".log";
        Process p = Process.Start(psi);
        p.Close();

Аргумент /c был ключом к закрытию cmd.exe,Когда я начал, я ввел аргумент /K, который поддерживает работу проклятого.Решаемые.Надеюсь это поможет.(Это как древний, но мы всегда забываем)

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