.NET Framework
System.Diagnostics
Ricerca…
Cronometro
Questo esempio mostra come è possibile utilizzare il Stopwatch
per confrontare un blocco di codice.
using System;
using System.Diagnostics;
public class Benchmark : IDisposable
{
private Stopwatch sw;
public Benchmark()
{
sw = Stopwatch.StartNew();
}
public void Dispose()
{
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
}
public class Program
{
public static void Main()
{
using (var bench = new Benchmark())
{
Console.WriteLine("Hello World");
}
}
}
Esegui comandi shell
string strCmdText = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);
Questo per nascondere la finestra di cmd.
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.StartInfo = startInfo;
process.Start();
Invia comando a CMD e Ricevi output
Questo metodo consente di inviare un command
a Cmd.exe
e restituisce l'output standard (incluso l'errore standard) come stringa:
private static string SendCommand(string command)
{
var cmdOut = string.Empty;
var startInfo = new ProcessStartInfo("cmd", command)
{
WorkingDirectory = @"C:\Windows\System32", // Directory to make the call from
WindowStyle = ProcessWindowStyle.Hidden, // Hide the window
UseShellExecute = false, // Do not use the OS shell to start the process
CreateNoWindow = true, // Start the process in a new window
RedirectStandardOutput = true, // This is required to get STDOUT
RedirectStandardError = true // This is required to get STDERR
};
var p = new Process {StartInfo = startInfo};
p.Start();
p.OutputDataReceived += (x, y) => cmdOut += y.Data;
p.ErrorDataReceived += (x, y) => cmdOut += y.Data;
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
return cmdOut;
}
uso
var servername = "SVR-01.domain.co.za";
var currentUsers = SendCommand($"/C QUERY USER /SERVER:{servername}")
Produzione
string currentUsers = "USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME Joe.Bloggs ica-cgp # 0 2 Attivo 24692 + 13: 29 25/07/2016 07:50 Jim.McFlannegan ica-cgp # 1 3 Attivo. 25/07 / 2016 08:33 Andy.McAnderson ica-cgp # 2 4 Attivo. 25/07/2016 08:54 John.Smith ica-cgp # 4 5 Attivo 14 25/07/2016 08:57 Bob.Bobbington ica-cgp # 5 6 Attivo 24692 + 13: 29 25/07/2016 09:05 Tim.Tom ica-cgp # 6 7 Attivo. 25/07/2016 09:08 Bob.Joges ica-cgp # 7 8 Attivo 24692 + 13: 29 25 / 07/2016 09:13 "
In alcune occasioni, l'accesso al server in questione potrebbe essere limitato a determinati utenti. Se si dispone delle credenziali di accesso per questo utente, è possibile inviare query con questo metodo:
private static string SendCommand(string command)
{
var cmdOut = string.Empty;
var startInfo = new ProcessStartInfo("cmd", command)
{
WorkingDirectory = @"C:\Windows\System32",
WindowStyle = ProcessWindowStyle.Hidden, // This does not actually work in conjunction with "runas" - the console window will still appear!
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Verb = "runas",
Domain = "doman1.co.za",
UserName = "administrator",
Password = GetPassword()
};
var p = new Process {StartInfo = startInfo};
p.Start();
p.OutputDataReceived += (x, y) => cmdOut += y.Data;
p.ErrorDataReceived += (x, y) => cmdOut += y.Data;
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
return cmdOut;
}
Ottenere la password:
static SecureString GetPassword()
{
var plainText = "password123";
var ss = new SecureString();
foreach (char c in plainText)
{
ss.AppendChar(c);
}
return ss;
}
Gli appunti
Entrambi i metodi precedenti restituiranno una concatenazione di STDOUT e STDERR, poiché OutputDataReceived
e ErrorDataReceived
si ErrorDataReceived
entrambi alla stessa variabile: cmdOut
.