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 |
} |
浙公网安备 33010602011771号