001 |
// Define the namespaces used by this sample. |
002 |
using System; |
003 |
using System.Text; |
004 |
using System.Globalization; |
005 |
using System.IO; |
006 |
using System.Diagnostics; |
007 |
using System.Threading; |
008 |
using System.ComponentModel; |
009 |
|
010 |
|
011 |
namespace ProcessAsyncStreamSamples |
012 |
{ |
013 |
|
014 |
class ProcessNetStreamRedirection |
015 |
{ |
016 |
// Define static variables shared by class methods. |
017 |
private static StreamWriter streamError = null ; |
018 |
private static String netErrorFile = "" ; |
019 |
private static StringBuilder netOutput = null ; |
020 |
private static bool errorRedirect = false ; |
021 |
private static bool errorsWritten = false ; |
022 |
|
023 |
public static void RedirectNetCommandStreams() |
024 |
{ |
025 |
String netArguments; |
026 |
Process netProcess; |
027 |
|
028 |
// Get the input computer name. |
029 |
Console.WriteLine( "Enter the computer name for the net view command:" ); |
030 |
netArguments = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture); |
031 |
if (String.IsNullOrEmpty(netArguments)) |
032 |
{ |
033 |
// Default to the help command if there is not an input argument. |
034 |
netArguments = "/?" ; |
035 |
} |
036 |
|
037 |
// Check if errors should be redirected to a file. |
038 |
errorsWritten = false ; |
039 |
Console.WriteLine( "Enter a fully qualified path to an error log file" ); |
040 |
Console.WriteLine( " or just press Enter to write errors to console:" ); |
041 |
netErrorFile = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture); |
042 |
if (!String.IsNullOrEmpty(netErrorFile)) |
043 |
{ |
044 |
errorRedirect = true ; |
045 |
} |
046 |
|
047 |
// Note that at this point, netArguments and netErrorFile |
048 |
// are set with user input. If the user did not specify |
049 |
// an error file, then errorRedirect is set to false. |
050 |
|
051 |
// Initialize the process and its StartInfo properties. |
052 |
netProcess = new Process(); |
053 |
netProcess.StartInfo.FileName = "Net.exe" ; |
054 |
|
055 |
// Build the net command argument list. |
056 |
netProcess.StartInfo.Arguments = String.Format( "view {0}" , |
057 |
netArguments); |
058 |
|
059 |
// Set UseShellExecute to false for redirection. |
060 |
netProcess.StartInfo.UseShellExecute = false ; |
061 |
|
062 |
// Redirect the standard output of the net command. |
063 |
// This stream is read asynchronously using an event handler. |
064 |
netProcess.StartInfo.RedirectStandardOutput = true ; |
065 |
netProcess.OutputDataReceived += new DataReceivedEventHandler(NetOutputDataHandler); |
066 |
netOutput = new StringBuilder(); |
067 |
|
068 |
if (errorRedirect) |
069 |
{ |
070 |
// Redirect the error output of the net command. |
071 |
netProcess.StartInfo.RedirectStandardError = true ; |
072 |
netProcess.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler); |
073 |
} |
074 |
else |
075 |
{ |
076 |
// Do not redirect the error output. |
077 |
netProcess.StartInfo.RedirectStandardError = false ; |
078 |
} |
079 |
|
080 |
Console.WriteLine( "/nStarting process: net {0}" , |
081 |
netProcess.StartInfo.Arguments); |
082 |
if (errorRedirect) |
083 |
{ |
084 |
Console.WriteLine( "Errors will be written to the file {0}" , |
085 |
netErrorFile); |
086 |
} |
087 |
|
088 |
// Start the process. |
089 |
netProcess.Start(); |
090 |
|
091 |
// Start the asynchronous read of the standard output stream. |
092 |
netProcess.BeginOutputReadLine(); |
093 |
|
094 |
if (errorRedirect) |
095 |
{ |
096 |
// Start the asynchronous read of the standard |
097 |
// error stream. |
098 |
netProcess.BeginErrorReadLine(); |
099 |
} |
100 |
|
101 |
// Let the net command run, collecting the output. |
102 |
netProcess.WaitForExit(); |
103 |
|
104 |
if (streamError != null ) |
105 |
{ |
106 |
// Close the error file. |
107 |
streamError.Close(); |
108 |
} |
109 |
else |
110 |
{ |
111 |
// Set errorsWritten to false if the stream is not |
112 |
// open. Either there are no errors, or the error |
113 |
// file could not be opened. |
114 |
errorsWritten = false ; |
115 |
} |
116 |
|
117 |
if (netOutput.Length > 0) |
118 |
{ |
119 |
// If the process wrote more than just |
120 |
// white space, write the output to the console. |
121 |
Console.WriteLine( "/nPublic network shares from net view:/n{0}/n" , |
122 |
netOutput); |
123 |
} |
124 |
|
125 |
if (errorsWritten) |
126 |
{ |
127 |
// Signal that the error file had something |
128 |
// written to it. |
129 |
String [] errorOutput = File.ReadAllLines(netErrorFile); |
130 |
if (errorOutput.Length > 0) |
131 |
{ |
132 |
Console.WriteLine( "/nThe following error output was appended to {0}." , |
133 |
netErrorFile); |
134 |
foreach (String errLine in errorOutput) |
135 |
{ |
136 |
Console.WriteLine( " {0}" , errLine); |
137 |
} |
138 |
} |
139 |
Console.WriteLine(); |
140 |
} |
141 |
|
142 |
netProcess.Close(); |
143 |
|
144 |
} |
145 |
|
146 |
private static void NetOutputDataHandler( object sendingProcess, |
147 |
DataReceivedEventArgs outLine) |
148 |
{ |
149 |
// Collect the net view command output. |
150 |
if (!String.IsNullOrEmpty(outLine.Data)) |
151 |
{ |
152 |
// Add the text to the collected output. |
153 |
netOutput.Append(Environment.NewLine + " " + outLine.Data); |
154 |
} |
155 |
} |
156 |
|
157 |
private static void NetErrorDataHandler( object sendingProcess, |
158 |
DataReceivedEventArgs errLine) |
159 |
{ |
160 |
// Write the error text to the file if there is something |
161 |
// to write and an error file has been specified. |
162 |
|
163 |
if (!String.IsNullOrEmpty(errLine.Data)) |
164 |
{ |
165 |
if (!errorsWritten) |
166 |
{ |
167 |
if (streamError == null ) |
168 |
{ |
169 |
// Open the file. |
170 |
try |
171 |
{ |
172 |
streamError = new StreamWriter(netErrorFile, true ); |
173 |
} |
174 |
catch (Exception e) |
175 |
{ |
176 |
Console.WriteLine( "Could not open error file!" ); |
177 |
Console.WriteLine(e.Message.ToString()); |
178 |
} |
179 |
} |
180 |
|
181 |
if (streamError != null ) |
182 |
{ |
183 |
// Write a header to the file if this is the first |
184 |
// call to the error output handler. |
185 |
streamError.WriteLine(); |
186 |
streamError.WriteLine(DateTime.Now.ToString()); |
187 |
streamError.WriteLine( "Net View error output:" ); |
188 |
} |
189 |
errorsWritten = true ; |
190 |
} |
191 |
|
192 |
if (streamError != null ) |
193 |
{ |
194 |
// Write redirected errors to the file. |
195 |
streamError.WriteLine(errLine.Data); |
196 |
streamError.Flush(); |
197 |
} |
198 |
} |
199 |
} |
200 |
} |
201 |
} |