Performing Management tasks using Cimcmdlets - Processes

WMI provides a standardized system management infrastructure that can be leveraged by a number of different clients. WMI providers and the classes exposed by the providers help in various management tasks.

Our MSDN documentation lists a bunch of management scenarios and the corresponding Visual Basic samples, but it is much easier for an IT administrator to perform the same operations using PowerShell.

Customers have been requesting samples that will help them perform management tasks using PowerShell – therefore, in this series of blog posts we will be covering the PowerShell implementation of scenarios that are listed at the following MSDN page: https://msdn.microsoft.com/en-us/library/aa394585(v=vs.85).aspx

In this post we will be going over the scenarios specific to "Process Management" listed at : https://msdn.microsoft.com/en-us/library/aa394599(v=vs.85).aspx

 

Here are the corresponding PowerShell snippets:

1. Run an application in a hidden window:

PS:> $processStartupClass = Get-CimClass -ClassName Win32_ProcessStartup -Namespace root/cimv2

$processStartupInfo = New-CimInstance -cimclass $processStartupClass -Property @{ShowWindow =0} –Local 

PS:> $processClass = Get-CimClass -ClassName Win32_Process -Namespace root/cimv2

PS:> Invoke-CimMethod -CimClass $processClass -MethodName Create -Arguments @{commandline="notepad.exe"; ProcessStartupInformation = [CimInstance]$processStartupInfo}

 

2. Determine which scripts are running on the local computer:

 

PS:> $query = "SELECT * FROM Win32_Process WHERE Name = 'cscript.exe' OR Name = 'wscript.exe'"

PS:> $insts = Get-CimInstance -Query $query -Namespace root/cimv2

PS:> $insts | Select Name, commandline

 

 

3. Find out the account name under which a process is running:

PS:> $query = "Select * from Win32_Process"

PS:> $insts = Get-CimInstance -Query $query -Namespace root/cimv2

PS:> # OR

PS:> $insts = Get-CimInstance –ClassName Win32_Process –Namespace root/cimv2

PS:> $insts | %{

                         Write-host $_.CimInstanceProperties["Name"]

                          $owner = Invoke-CimMethod -InputObject $_ -MethodName GetOwner

                          $owner | Select Domain, User, PSComputerName

                       }

 

4. Change the priority of a running process:

PS:> $query = "Select * from Win32_Process Where Name = 'Notepad.exe'"

PS:> $insts = Get-CimInstance -Query $query -Namespace root/cimv2

PS:> $aboveNormal = 32768

PS:> $insts | %{

    Invoke-CimMethod -InputObject $_ -MethodName SetPriority -Arguments @{Priority = [Uint32]$aboveNormal}

 

5. Terminate a process using a script:

PS:> $query = "Select * from Win32_Process Where Name = 'Notepad.exe'"

PS:> Invoke-CimMethod -Query $query -MethodName Terminate

 

6. Determine how much processor time and memory each process is using:

$query = "Select * from win32_process"

$procs = Get-CimInstance -Query $query

# OR

$procs = Get-CimInstance –ClassName Win32_Process –Namespace root/cimv2

 

foreach($proc in $procs)

{

    $result = New-Object PSObject -Property @{

                                processorTime = ($proc.KernalModeTime + $proc.UserModeTime) / 10000000

                                Name = $proc.Name

                                ProcessID = $proc.ProcessId

                                WorkingSetSize = $proc.WorkingSetSize

                                PageFileUsage = $proc.PageFileUsage

                                PageFaults = $proc.PageFaults

                            }

                                                              

$result | Format-Table -Property @("Name", "ProcessID", "WorkingSetSize", "PageFileUsage", "PageFaults", "ProcessorTime")

}

 

 

7. Determine what applications are running on a remote computer:

$cimSession = New-CimSession remoteMachine –Credential $psCreds

$query = "Select * from Win32_Process"

$procs = Get-CimInstance -Query $query -CimSession $cimSession

# OR

$procs = Get-CimInstance –ClassName Win32_Process –Namespace root/cimv2

$procs | Format-Table –Property @(“Name", “ProcessID", “ThreadCount", “PageFileUsage", “PageFaults", “WorkingSetSize")

 

As mentioned above, this blog series will cover various management scenarios. The next post will be about Computer Hardware Management scenarios listed at: https://msdn.microsoft.com/en-us/library/aa394587(v=vs.85).aspx

 

Thanks

Vaibhav Chugh [MSFT]

Standards Based Management

Comments

  • Anonymous
    June 30, 2014
    I can't see why I'd want to use this approach to addressing the scenarios you've based this on.   For example #1, running an application in a hidden window.    I'd perfer:    Start-Process (Get-Command notepad).Source -WindowStyle Hidden It seems like all these scenarios (except perhaps #3 - getting owner of a process) have simpler solutions using the standard PowerShell features that have been around since PowerShell version 1.      

  • Anonymous
    July 01, 2014
    I agree with you, PowerShell certainly has easier ways of achieving the above mentioned scenarios. This blog post and the examples were specifically designed to show the users how CimCmdlets and WMI providers can be used to perform various operations.