///////////////////////////////////////////////////////////////////////////////////////////////
//
// 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);
}
}
}
}
ASP.NET & Csharp (C#)
ASP.NET & Csharp (C#) , Here you can find my posts about .NET c# .
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);
}
}
Enum Modules For Pid
using System;
using System.Diagnostics;
class MainClass {
static void Main(string[] args) {
int pID = 12345;
Process theProc;
try { theProc = Process.GetProcessById(pID); } catch {
Console.WriteLine("bad PID!");
return;
}
Console.WriteLine("Here are the loaded modules for: {0}", theProc.ProcessName);
try {
ProcessModuleCollection theMods = theProc.Modules;
foreach (ProcessModule pm in theMods) {
Console.WriteLine(string.Format("-> Mod Name: {0}", pm.ModuleName));
}
} catch { Console.WriteLine("No mods!"); }
}
}