using System; using System.Diagnostics; class MainClass { public static void Main() { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.Arguments = "file.txt"; startInfo.WorkingDirectory = @"C:Temp"; startInfo.WindowStyle = ProcessWindowStyle.Maximized; startInfo.ErrorDialog = true; Process process; try { process = Process.Start(startInfo); Console.WriteLine("Waiting 30 seconds for process to finish."); if (process.WaitForExit(30000)) { Console.WriteLine("Process terminated."); } else { Console.WriteLine("Timed out waiting for process to end."); } } catch (Exception ex) { Console.WriteLine("Could not start process."); Console.WriteLine(ex); } } }
Create Process As User
/////////////////////////////////////////////////////////////////////////////////////////////// // // This File is Part of the CallButler Open Source PBX (http://www.codeplex.com/callbutler // // Copyright (c) 2005-2008, Jim Heising // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation and/or // other materials provided with the distribution. // // * Neither the name of Jim Heising nor the names of its contributors may be // used to endorse or promote products derived from this software without specific prior // written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////////////////////// using System; using System.Text; using System.Runtime.InteropServices; using System.Security.Principal; using System.Security.Permissions; namespace WOSI.Utilities { public class ProcessUtils { [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public Int32 cb; public string lpReserved; public string lpDesktop; public string lpTitle; public Int32 dwX; public Int32 dwY; public Int32 dwXSize; public Int32 dwXCountChars; public Int32 dwYCountChars; public Int32 dwFillAttribute; public Int32 dwFlags; public Int16 wShowWindow; public Int16 cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } // Declare the logon types as constants const long LOGON32_LOGON_INTERACTIVE = 2; const long LOGON32_LOGON_NETWORK = 3; // Declare the logon providers as constants const long LOGON32_PROVIDER_DEFAULT = 0; const long LOGON32_PROVIDER_WINNT50 = 3; const long LOGON32_PROVIDER_WINNT40 = 2; const long LOGON32_PROVIDER_WINNT35 = 1; [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public Int32 dwProcessID; public Int32 dwThreadID; } [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public Int32 Length; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; } public enum SECURITY_IMPERSONATION_LEVEL { SecurityAnonymous, SecurityIdentification, SecurityImpersonation, SecurityDelegation } public enum TOKEN_TYPE { TokenPrimary = 1, TokenImpersonation } public const int GENERIC_ALL_ACCESS = 0x10000000; [ DllImport("kernel32.dll", EntryPoint = "CloseHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall) ] public static extern bool CloseHandle(IntPtr handle); [ DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall) ] public static extern bool CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, Int32 dwCreationFlags, IntPtr lpEnvrionment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, ref PROCESS_INFORMATION lpProcessInformation); [ DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx") ] public static extern bool DuplicateTokenEx(IntPtr hExistingToken, Int32 dwDesiredAccess, ref SECURITY_ATTRIBUTES lpThreadAttributes, Int32 ImpersonationLevel, Int32 dwTokenType, ref IntPtr phNewToken); [DllImport("advapi32.dll", EntryPoint = "LogonUser")] private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("userenv.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool LoadUserProfile(IntPtr hToken, ref ProfileInfo lpProfileInfo); [DllImport("userenv.dll", SetLastError = true)] static extern bool CreateEnvironmentBlock(out IntPtr lpEnvironment, IntPtr hToken, bool bInherit); /// /// Profile Info /// [StructLayout(LayoutKind.Sequential)] public struct ProfileInfo { /// /// Specifies the size of the structure, in bytes. /// public int dwSize; /// /// This member can be one of the following flags: PI_NOUI or PI_APPLYPOLICY /// public int dwFlags; /// /// Pointer to the name of the user. /// This member is used as the base name of the directory in which to store a new profile. /// public string lpUserName; /// /// Pointer to the roaming user profile path. /// If the user does not have a roaming profile, this member can be NULL. /// public string lpProfilePath; /// /// Pointer to the default user profile path. This member can be NULL. /// public string lpDefaultPath; /// /// Pointer to the name of the validating domain controller, in NetBIOS format. /// If this member is NULL, the Windows NT 4.0-style policy will not be applied. /// public string lpServerName; /// /// Pointer to the path of the Windows NT 4.0-style policy file. This member can be NULL. /// public string lpPolicyPath; /// /// Handle to the HKEY_CURRENT_USER registry key. /// public IntPtr hProfile; } public static void CreateProcessAsUser(string username, string domain, string password, string commandLine) { IntPtr hToken = IntPtr.Zero; IntPtr hDupedToken = IntPtr.Zero; PROCESS_INFORMATION pi = new PROCESS_INFORMATION(); try { bool result = LogonUser(username, domain, password, (int)LOGON32_LOGON_INTERACTIVE, (int)LOGON32_PROVIDER_DEFAULT, ref hToken); if (!result) { throw new ApplicationException("LogonUser failed"); } SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES(); sa.Length = Marshal.SizeOf(sa); result = DuplicateTokenEx( hToken, GENERIC_ALL_ACCESS, ref sa, (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, (int)TOKEN_TYPE.TokenPrimary, ref hDupedToken ); if (!result) { throw new ApplicationException("DuplicateTokenEx failed"); } STARTUPINFO si = new STARTUPINFO(); si.cb = Marshal.SizeOf(si); si.lpDesktop = "winsta0default"; ProfileInfo info = new ProfileInfo(); info.dwSize = Marshal.SizeOf(info); info.lpUserName = username; info.dwFlags = 1; result = LoadUserProfile(hDupedToken, ref info); if (!result) { int error = Marshal.GetLastWin32Error(); throw new System.ComponentModel.Win32Exception(error); } IntPtr lpEnvironment; result = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false); if (!result) { int error = Marshal.GetLastWin32Error(); throw new System.ComponentModel.Win32Exception(error); } result = CreateProcessAsUser( hDupedToken, null, commandLine, ref sa, ref sa, false, 0x00000400, lpEnvironment, null, ref si, ref pi ); if (!result) { int error = Marshal.GetLastWin32Error(); throw new System.ComponentModel.Win32Exception(error); } } finally { if (pi.hProcess != IntPtr.Zero) CloseHandle(pi.hProcess); if (pi.hThread != IntPtr.Zero) CloseHandle(pi.hThread); if (hDupedToken != IntPtr.Zero) CloseHandle(hDupedToken); } } } }
Start Process With File name
//http://simpledbbrowser.codeplex.com/ //License: Microsoft Public License (Ms-PL) using System.Diagnostics; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; namespace AWS.Framework.WPF.Utility { public sealed class Helpers { public static void StartProcessWithFilename(string fileName) { // Start a process: http://dotnet.mvps.org/dotnet/faqs/?id=openfileappwebpage&lang=en ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = fileName; psi.UseShellExecute = true; Process.Start(psi); } } }
Listing all threads for a process inn a ListView
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Diagnostics; public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.ColumnHeader VirtualMemory; private System.Windows.Forms.ColumnHeader Priority; private System.Windows.Forms.ColumnHeader Id; private System.Windows.Forms.Label machinename; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label3; private System.Windows.Forms.ListBox listBox1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.ListView listView1; private System.Windows.Forms.ColumnHeader ThreadID; private System.Windows.Forms.ColumnHeader ThreadPriority; private System.Windows.Forms.ColumnHeader ProcessorTime; private ArrayList sProcIds; public Form1() { this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.machinename = new System.Windows.Forms.Label(); this.ThreadPriority = new System.Windows.Forms.ColumnHeader(); this.ThreadID = new System.Windows.Forms.ColumnHeader(); this.VirtualMemory = new System.Windows.Forms.ColumnHeader(); this.listBox1 = new System.Windows.Forms.ListBox(); this.listView1 = new System.Windows.Forms.ListView(); this.ProcessorTime = new System.Windows.Forms.ColumnHeader(); this.Priority = new System.Windows.Forms.ColumnHeader(); this.Id = new System.Windows.Forms.ColumnHeader(); this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); this.label1.Location = new System.Drawing.Point(16, 16); this.label1.Size = new System.Drawing.Size(88, 16); this.label1.Text = "Machine name:"; this.label2.Location = new System.Drawing.Point(16, 48); this.label2.Size = new System.Drawing.Size(100, 16); this.label2.Text = "Running Processes:"; this.label3.Location = new System.Drawing.Point(16, 184); this.label3.Size = new System.Drawing.Size(100, 16); this.label3.Text = "Threads:"; this.machinename.Location = new System.Drawing.Point(128, 16); this.machinename.Size = new System.Drawing.Size(100, 16); this.ThreadPriority.Text = "Priority"; this.ThreadID.Text = "Thread ID"; this.VirtualMemory.Text = "Virtual Mem"; this.listBox1.Location = new System.Drawing.Point(16, 80); this.listBox1.Size = new System.Drawing.Size(408, 95); this.listBox1.SelectedIndexChanged += new System.EventHandler(this.SelectItemHandler); this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.ThreadID, this.ThreadPriority, this.ProcessorTime}); this.listView1.Location = new System.Drawing.Point(16, 200); this.listView1.Size = new System.Drawing.Size(408, 97); this.ProcessorTime.Text = "Processor Time"; this.ProcessorTime.Width = 90; this.Priority.Text = "Priority"; this.Id.Text = "ID"; this.Id.Width = 20; this.button1.Location = new System.Drawing.Point(352, 312); this.button1.Size = new System.Drawing.Size(64, 24); this.button1.Text = "Close"; this.button1.Click += new System.EventHandler(this.button1_Click); this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(440, 349); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.listView1, this.machinename, this.button1, this.label3, this.listBox1, this.label2, this.label1}); this.ResumeLayout(false); sProcIds = new ArrayList(); machinename.Text = Process.GetCurrentProcess().MachineName; Process[] sProcess = Process.GetProcesses(); foreach (Process p in sProcess) { listBox1.Items.Add(p.ProcessName); sProcIds.Add(p.Id); } } protected void SelectItemHandler(object sender, System.EventArgs e) { int idx = this.listBox1.SelectedIndex; Process proc = Process.GetProcessById((int)sProcIds[idx]); ProcessThreadCollection procThreads = proc.Threads; this.listView1.View = System.Windows.Forms.View.Details; this.listView1.Items.Clear(); int nRow = 0; foreach (ProcessThread pt in procThreads) { string priority = "Normal"; switch ((int)proc.BasePriority) { case 8: priority = "Normal"; break; case 13: priority = "High"; break; case 24: priority = "Real Time"; break; case 4: default: priority = "Idle"; break; } this.listView1.Items.Add(pt.Id.ToString()); this.listView1.Items[nRow].SubItems.Add(priority); this.listView1.Items[nRow].SubItems.Add(pt.UserProcessorTime.ToString()); nRow++; } } protected void button1_Click(object sender, System.EventArgs e) { Close(); } public static void Main(string[] args) { Application.Run(new Form1()); } }
Detecting Process Completion
using System; using System.Diagnostics; public class DetectingProcessCompletion { static void ProcessDone(object sender, EventArgs e) { Console.WriteLine("Process Exited"); } public static void Main() { Process p = new Process(); p.StartInfo.FileName = "notepad.exe"; p.StartInfo.Arguments = "process3.cs"; p.EnableRaisingEvents = true; p.Exited += new EventHandler(ProcessDone); p.Start(); p.WaitForExit(); Console.WriteLine("Back from WaitForExit()"); } }
Input Output:Starting Processes
using System.Diagnostics; public class StartingProcesses { public static void Main() { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.Arguments = "process.cs"; Process.Start(startInfo); } }
Build up a list of the running processes
using System; using System.Collections.Generic; using System.Diagnostics; class MainClass { static void Main() { List<String> processes = new List<String>(); foreach (Process process in Process.GetProcesses()) processes.Add(process.ProcessName); } }