Leandro Campos
Leandro Campos

Reputation: 340

C# with WMIC command

I'm trying to execute wmic command on C# and get the output, but the function is only returning first line and the command which is not running.

Code:

private static String wimc(String cmd)
    {
        var psi = new ProcessStartInfo("wmic");
        psi.Arguments = @"shadowcopy call create Volume='C:\'";
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        var p = Process.Start(psi);
        p.WaitForExit();
        String output = p.StandardOutput.ReadToEnd();


        return output;
    }

Output on C#:

Executing (Win32_ShadowCopy)->create()

Only show first line and command not working

Cmd output(expected)

Executing (Win32_ShadowCopy)->create() Method execution successful. Out Parameters: instance of __PARAMETERS {
            ReturnValue = 0;
            ShadowID = "{B2FDCFDE-7C48-4F96-9648-9A15DB89506C}"; 
};

shadowcopy on cmd was created with sucess

Upvotes: 2

Views: 4773

Answers (2)

K_Unit
K_Unit

Reputation: 111

Here is what worked for me.

System.Diagnostics.ProcessStartInfo usbDevicesInfo = new System.Diagnostics.ProcessStartInfo("wmic", "path CIM_USBDevice get Caption");
usbDevicesInfo.RedirectStandardOutput = true;
usbDevicesInfo.UseShellExecute = false;
usbDevicesInfo.CreateNoWindow = true;
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = usbDevicesInfo;
process.Start();
process.WaitForExit();
Console.WriteLine("ExitCode: " + process.ExitCode.ToString() + "\n");
result = process.StandardOutput.ReadToEnd();
Console.WriteLine(result);

Upvotes: 0

Archlight
Archlight

Reputation: 2079

For redirecting wmic to the console output you need to add /OUTPUT:STDOUT to your arguments.

And of course you will need to run your C# application as administrator.

var psi = new ProcessStartInfo("wmic");
psi.Arguments = @"/OUTPUT:STDOUT shadowcopy call create Volume='C:\'";
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
var p = Process.Start(psi);
p.WaitForExit();
String output = p.StandardOutput.ReadToEnd();
String errOutput = p.StandardError.ReadToEnd();

Upvotes: 1

Related Questions