// Define the namespaces used by this sample. using System; using System.Text; using System.Globalization; using System.IO; using System.Diagnostics; using System.Threading; using System.ComponentModel; namespace ProcessAsyncStreamSamples { class ProcessNetStreamRedirection { // Define static variables shared by class methods. private static StreamWriter streamError =null; private static String netErrorFile = ""; private static StringBuilder netOutput = null; private static bool errorRedirect = false; private static bool errorsWritten = false; public static void RedirectNetCommandStreams() { String netArguments; Process netProcess; // Get the input computer name. Console.WriteLine("Enter the computer name for the net view command:"); netArguments = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture); if (String.IsNullOrEmpty(netArguments)) { // Default to the help command if there is not an input argument. netArguments = "/?"; } // Check if errors should be redirected to a file. errorsWritten = false; Console.WriteLine("Enter a fully qualified path to an error log file"); Console.WriteLine(" or just press Enter to write errors to console:"); netErrorFile = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture); if (!String.IsNullOrEmpty(netErrorFile)) { errorRedirect = true; } // Note that at this point, netArguments and netErrorFile // are set with user input. If the user did not specify // an error file, then errorRedirect is set to false. // Initialize the process and its StartInfo properties. netProcess = new Process(); netProcess.StartInfo.FileName = "Net.exe"; // Build the net command argument list. netProcess.StartInfo.Arguments = String.Format("view {0}", netArguments); // Set UseShellExecute to false for redirection. netProcess.StartInfo.UseShellExecute = false; // Redirect the standard output of the net command. // This stream is read asynchronously using an event handler. netProcess.StartInfo.RedirectStandardOutput = true; netProcess.OutputDataReceived += new DataReceivedEventHandler(NetOutputDataHandler); netOutput = new StringBuilder(); if (errorRedirect) { // Redirect the error output of the net command. netProcess.StartInfo.RedirectStandardError = true; netProcess.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler); } else { // Do not redirect the error output. netProcess.StartInfo.RedirectStandardError = false; } Console.WriteLine("\nStarting process: net {0}", netProcess.StartInfo.Arguments); if (errorRedirect) { Console.WriteLine("Errors will be written to the file {0}", netErrorFile); } // Start the process. netProcess.Start(); // Start the asynchronous read of the standard output stream. netProcess.BeginOutputReadLine(); if (errorRedirect) { // Start the asynchronous read of the standard // error stream. netProcess.BeginErrorReadLine(); } // Let the net command run, collecting the output. netProcess.WaitForExit(); if (streamError != null) { // Close the error file. streamError.Close(); } else { // Set errorsWritten to false if the stream is not // open. Either there are no errors, or the error // file could not be opened. errorsWritten = false; } if (netOutput.Length > 0) { // If the process wrote more than just // white space, write the output to the console. Console.WriteLine("\nPublic network shares from net view:\n{0}\n", netOutput); } if (errorsWritten) { // Signal that the error file had something // written to it. String [] errorOutput = File.ReadAllLines(netErrorFile); if (errorOutput.Length > 0) { Console.WriteLine("\nThe following error output was appended to {0}.", netErrorFile); foreach (String errLine in errorOutput) { Console.WriteLine(" {0}", errLine); } } Console.WriteLine(); } netProcess.Close(); } private static void NetOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine) { // Collect the net view command output. if (!String.IsNullOrEmpty(outLine.Data)) { // Add the text to the collected output. netOutput.Append(Environment.NewLine + " " + outLine.Data); } } private static void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine) { // Write the error text to the file if there is something // to write and an error file has been specified. if (!String.IsNullOrEmpty(errLine.Data)) { if (!errorsWritten) { if (streamError == null) { // Open the file. try { streamError = new StreamWriter(netErrorFile, true); } catch (Exception e) { Console.WriteLine("Could not open error file!"); Console.WriteLine(e.Message.ToString()); } } if (streamError != null) { // Write a header to the file if this is the first // call to the error output handler. streamError.WriteLine(); streamError.WriteLine(DateTime.Now.ToString()); streamError.WriteLine("Net View error output:"); } errorsWritten = true; } if (streamError != null) { // Write redirected errors to the file. streamError.WriteLine(errLine.Data); streamError.Flush(); } } } } }