Looking for .net Keywords? Try Ask4Keywords

.NET Framework Отправить команду CMD и получить выход


пример

Этот метод позволяет отправить command на Cmd.exe и возвращает стандартный вывод (включая стандартную ошибку) в виде строки:

private static string SendCommand(string command)
{
    var cmdOut = string.Empty;
    
    var startInfo = new ProcessStartInfo("cmd", command)
    {
        WorkingDirectory = @"C:\Windows\System32", // Directory to make the call from
        WindowStyle = ProcessWindowStyle.Hidden,   // Hide the window
        UseShellExecute = false,                   // Do not use the OS shell to start the process
        CreateNoWindow = true,                     // Start the process in a new window 
        RedirectStandardOutput = true,             // This is required to get STDOUT
        RedirectStandardError = true               // This is required to get STDERR
    };

    var p = new Process {StartInfo = startInfo};

    p.Start();

    p.OutputDataReceived += (x, y) => cmdOut += y.Data;
    p.ErrorDataReceived += (x, y) => cmdOut += y.Data;
    p.BeginOutputReadLine();
    p.BeginErrorReadLine();
    p.WaitForExit();
    return cmdOut;
}

использование

var servername = "SVR-01.domain.co.za";
var currentUsers = SendCommand($"/C QUERY USER /SERVER:{servername}")

Выход

string currentUsers = "USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME Joe.Bloggs ica-cgp # 0 2 Active 24692 + 13: 29 25/07/2016 07:50 Jim.McFlannegan ica-cgp # 1 3 Активен. 25/07 / 2016 08:33 Andy.McAnderson ica-cgp # 2 4 Актив. 25/07/2016 08:54 John.Smith ica-cgp # 4 5 Актив 14 25/07/2016 08:57 Bob.Bobbington ica-cgp # 5 6 Active 24692 + 13: 29 25/07/2016 09:05 Tim.Tom ica-cgp # 6 7 Активен. 25/07/2016 09:08 Bob.Joges ica-cgp # 7 8 Актив 24692 + 13: 29 25 / 07/2016 09:13 "


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

private static string SendCommand(string command)
{
    var cmdOut = string.Empty;
    
    var startInfo = new ProcessStartInfo("cmd", command)
    {
        WorkingDirectory = @"C:\Windows\System32",
        WindowStyle = ProcessWindowStyle.Hidden,    // This does not actually work in conjunction with "runas" - the console window will still appear!
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardOutput = true, 
        RedirectStandardError = true,

        Verb = "runas",
        Domain = "doman1.co.za",
        UserName = "administrator",
        Password = GetPassword()
    };

    var p = new Process {StartInfo = startInfo};

    p.Start();

    p.OutputDataReceived += (x, y) => cmdOut += y.Data;
    p.ErrorDataReceived += (x, y) => cmdOut += y.Data;
    p.BeginOutputReadLine();
    p.BeginErrorReadLine();
    p.WaitForExit();
    return cmdOut;
}

Получение пароля:

static SecureString GetPassword()
{
    var plainText = "password123";
    var ss = new SecureString();
    foreach (char c in plainText)
    {
        ss.AppendChar(c);
    }

    return ss;
}

Заметки

Оба вышеуказанных метода возвращают конкатенацию STDOUT и STDERR, так как OutputDataReceived и ErrorDataReceived присоединяются к одной и той же переменной - cmdOut .