Click here to Skip to main content
Licence CPOL
First Posted 26 Mar 2007
Views 93,341
Downloads 1,599
Bookmarked 75 times

How To: (Almost) Everything In WMI via C# Part 2: Processes

By thund3rstruck | 19 Oct 2007
A C# Wrapper for WMI Win32_Process Class
1 vote, 8.3%
1

2
1 vote, 8.3%
3
3 votes, 25.0%
4
7 votes, 58.3%
5
4.48/5 - 12 votes
1 removed
μ 4.21, σa 2.19 [?]
Screenshot - WIN32_Process.jpg

Introduction

This is the second article in the series of articles How To: (Almost) Everything In WMI via C#.

This article focuses on the Win32_Process class within the root\CIMV2 namespace. This library exposes all the properties and methods encapsulated in this namespace to your application (and there are quite a few). Using this library, you can enumerate properties of the processes on your machines, kick off processes, terminate processes, enumerate processes, and gather significant details regarding your processes. The library facilitates running any of these tasks on local or remote workstations.

Consideration

Please do not send me emails with instructions on how to perform these tasks using .NET native classes. That is not the point of these articles. I'm composing these articles for the purpose of demonstrating how to use WMI within C#.NET with the System.Management namespace. Also note that WMI is a bit slower than the .NET classes so if you have no specific need to use WMI, you should probably be using System.Diagnostics.Process instead.

Using the Attached Code

Methods (Local Machine or Remote Machine)

  • CreateProcess(string processPath) - Starts a process
  • GetProcessOwner(string processName) - Gets the user name of the process owner
  • GetProcessOwnerSID(string processName) - Gets the SID of the process owner
  • ProcessProperties(string processName) - Gets the 60+ property values of the process
  • RunningProcesses() - Gets the names of all the running processes (can be changed)
  • SetPriority(string processName, ProcessPriority.priority priority) - Changes the process priority
  • TerminateProcess(string processName) - Kills the process

Instantiate the Local Provider

//using baileysoft.Wmi.Process; *must include
ProcessLocal processObject = new ProcessLocal(); 

Walkthrough All the Methods

 //Get Running Processes
 Console.WriteLine("Fetching Running Processes: ");
 foreach (string eachProcess in processObject.RunningProcesses())
 {
    Console.WriteLine("Process: " + eachProcess);
 }
 Console.WriteLine("");
 
 //Start Process
 string processName = "notepad.exe";
 Console.WriteLine("Creating Process: " + processName);
 Console.WriteLine(processObject.CreateProcess(processName));
 
 //Change the Priority
 Console.WriteLine("Setting Process Priority: Idle");
 processObject.SetPriority(processName, ProcessPriority.priority.IDLE);
 
 //Get the Owner of a Process
 Console.WriteLine("Process Owner: " + processObject.GetProcessOwner(processName));
 
 //Get the Process Owner's SID 
 Console.WriteLine("Process Owner SID: " + 
    processObject.GetProcessOwnerSID(processName));
 Console.WriteLine("");

 //Get a collection of all the Properties of a Process (Memory Usage, etc, etc)
 Console.WriteLine("Properties of Process: " + processName);
 foreach (string property in processObject.ProcessProperties(processName))
  {
      Console.WriteLine(property);
  }
  Console.WriteLine("");
  
  //Terminate a Process  
  Console.WriteLine("Killing Process: " + processName);
  processObject.TerminateProcess(processName);
  Console.WriteLine("Process Terminated");  
  
  Console.ReadLine();

Remote System Processes

In order to run the code above against a remote machine, you must instantiate the ProcessRemote class. During this instantiation, you need to either send in explicit credentials or you can send in null values if you're running this on a workstation on a domain, logged in with a domain account with the appropriate permissions to perform these tasks against the remote workstation.

Instantiating the Remote Provider

//using baileysoft.Wmi.Process; *must include
ProcessRemote processObject = 
              new ProcessRemote(userName,
                                password,
                                domain,
                                machine/ip);

Connecting to a Remote Machine Where You Want to Use The Domain Credentials from the LoggedIn User

ProcessRemote processObject = 
                    new ProcessRemote(null,
                                      null,
                                      null,
                                      machine/ip);

Using a Service Account to kick off a Remote Process

ProcessRemote processObject = 
                    new ProcessRemote("neal.bailey",
                                      "S3cr3tPa$$",
                                      "BAILEYSOFT",
                                      "192.168.2.1");
                                      
                    processObject.OneOfTheMethodsDetailedAbove;

Conclusion

The WMI (Windows Management Instrumentation) provider is considerably slower than the native .NET classes. At first it may seem pointless to use WMI for process management tasks considering the ease of use of the .NET System.Diagnostics.Process classes, however a lot of developers out there spent a lot of time learning WMI and would like to have it available in their toolbox.

History

  • Originally submitted on 26th March, 2007

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

thund3rstruck

Software Developer

United States United States

Member
I'm a typical 30 year old generation X guy that likes video games, NFL football, and comic style art. I have an insatiable passion for programming and doing what ever it takes to become a better programmer.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 4 Pinmemberalhambra-eidos8:02 11 Jan '11  
Generalremote process start problem Pinmemberiro4es7:26 23 Feb '10  
GeneralRe: remote process start problem PinmemberBoštjan Primožič11:32 12 Oct '10  
GeneralRe: remote process start problem [modified] Pinmemberthund3rstruck11:55 12 Oct '10  
GeneralRe: remote process start problem PinmemberBoštjan Primožič6:32 13 Oct '10  
GeneralRe: remote process start problem Pinmemberthund3rstruck10:04 13 Oct '10  
GeneralRe: remote process start problem PinmemberBoštjan Primožič11:11 13 Oct '10  
GeneralRe: remote process start problem PinmemberBoštjan Primožič1:43 19 Oct '10  
GeneralRe: remote process start problem Pinmembermaster_ua3:03 3 Dec '10  
General.NET C# start remote process and send commands(strings) to it Pinmemberlegeti12:28 10 Nov '09  
GeneralTrying to use UNC with this code snippet Pinmemberthrashmagazine9:54 13 Apr '09  
GeneralRe: Trying to use UNC with this code snippet Pinmemberthund3rstruck10:14 13 Apr '09  
GeneralRe: Trying to use UNC with this code snippet Pinmemberthrashmagazine4:31 14 Apr '09  
GeneralRe: Trying to use UNC with this code snippet Pinmemberthund3rstruck5:02 14 Apr '09  
QuestionE_ACCESSDENIED PinmemberNchek20005:57 28 Nov '07  
I'm using VS2005 and winXP pro SP2.
 
I get that error when trying to running it to remote machine(Win2003 Server), but I can use your remote registry. I'm using user: Administrator for win2k3.
 
Should I do something in the server first?
AnswerRe: E_ACCESSDENIED Pinmemberthund3rstruck12:05 12 Oct '10  
GeneralPrinting Pinmemberpaulsoren9:00 3 Apr '07  
GeneralRe: Printing Pinmemberthund3rstruck13:30 3 Apr '07  
GeneralWMI PinmemberJamsey120014:11 3 Apr '07  
GeneralRe: WMI Pinmemberthund3rstruck5:27 3 Apr '07  
GeneralRe: WMI PinmemberJamsey120015:39 3 Apr '07  
GeneralRe: WMI Pinmemberthund3rstruck13:28 3 Apr '07  
GeneralRe: WMI Pinmembertag200118:34 22 Oct '07  
GeneralRe: WMI Pinmemberthund3rstruck4:06 23 Oct '07  
GeneralRe: WMI Pinmemberandyzheng23:02 30 Oct '08  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120210.1 | Last Updated 19 Oct 2007
Article Copyright 2007 by thund3rstruck
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid