Hamdi Baligh
Hamdi Baligh

Reputation: 892

Redirecting console output to a log file

I am working with the WMI API for c# in order to connect to a remote server and execute some commands. I have successfully established a connection. All I need now is to redirect the output of the remote CMD into a log file in my local machine.

Here is my code :

ConnectionOptions options = new ConnectionOptions();
options.Username = "login";
options.Password = "password";
ManagementScope scope = new ManagementScope("\\\\myserver\\root\\cimv2", options);
scope.Options.EnablePrivileges = true;
scope.Options.Impersonation = System.Management.ImpersonationLevel.Impersonate;
try
{
    scope.Connect();
    System.Management.ManagementClass local_ClassInstance = new System.Management.ManagementClass(scope, new System.Management.ManagementPath("Win32_Process"), null);
    Console.WriteLine("SUCCESS");
    //execute the command
    System.Management.ManagementBaseObject local_InParams = local_ClassInstance.GetMethodParameters("Create");
    local_InParams["CommandLine"] = @"cmd.exe /C myCommand";
    local_InParams["CurrentDirectory"] = @"mypath";
    System.Management.ManagementBaseObject local_ManagementBaseObject = local_ClassInstance.InvokeMethod("Create", local_InParams, null);
}
catch (Exception e)
{
    Console.WriteLine("FAILURE"+e.ToString());
}

Edit

I tried to accomplish this by using the '>' primitive :

local_InParams["CommandLine"] = "command > log.txt";

But the output file that I created doesn't contain anything.

I tried also to do this using a process

Process myProcess = new Process();
myProcess.StartInfo.FileName = "ipconfig";
myProcess.StartInfo.Arguments = "/all";
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.UseShellExecute = false;
myProcess.Start();
myProcess.WaitForExit();
string myResult = myProcess.StandardOutput.ReadToEnd();
Console.WriteLine(myResult);
myProcess.Close();

But the process does not return the information that I want because I want the output of cmd of the remote machine (Because I want the log of the behaviour of the server while running the command).

Any Help please ?

Upvotes: 0

Views: 1429

Answers (1)

DRapp
DRapp

Reputation: 48139

I too had an issue with capturing, and found ANOTHER redirect that works similar to what you have...

myProcess.StartInfo.RedirectStandardError = true;
// trap normal data received AND any ERROR data received too
myProcess.OutputDataReceived += DOSOutputResultsHandler;
myProcess.ErrorDataReceived += DOSOutputErrorsHandler;

I also have two string builder properties for capturing the output responses on my class that does the DOS Call process

StringBuilder DOSOutputResults = new StringBuilder();
StringBuilder DOSOutputErrors = new StringBuilder();


protected void DOSOutputResultsHandler(object sendingProcess,
   System.Diagnostics.DataReceivedEventArgs outLine)
{
   if (!string.IsNullOrEmpty(outLine.Data))
      // track data into the NORMAL output string builder
      DOSOutputResults.Append(Environment.NewLine + outLine.Data);
}


protected void DOSOutputErrorsHandler(object sendingProcess,
   System.Diagnostics.DataReceivedEventArgs outLine)
{
   if (!String.IsNullOrEmpty(outLine.Data))
      // track data into the ERROR output string builder
      DOSOutputErrors.Append(Environment.NewLine + outLine.Data);
}

Additionally, for using the primitive ">" redirection, there is also a "2>" redirection that handles errors not redirected to normal output. I found this out when dealing with DOS calls to Java.

Upvotes: 1

Related Questions