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 |
} |