Upload dependency
This commit is contained in:
parent
b9dc578267
commit
9c28d60350
1 changed files with 170 additions and 0 deletions
170
pause-process.ps1
Normal file
170
pause-process.ps1
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
# Pause/unpause a process. Just provide a PID or a PID from the pipeline
|
||||
# by Mick Douglas @BetterSafetyNet
|
||||
|
||||
# License: Creative Commons Attribution
|
||||
# https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Warning:
|
||||
# This script will pause (and unpause) running programs.
|
||||
# Obviously, this can cause system stability issues.
|
||||
# The author and contributors of this script assume NO liability for the use of this script.
|
||||
# Users of this script are **stridently** urged to test in a non-production environment first.
|
||||
|
||||
# todos:
|
||||
# Easy
|
||||
# create better error logics
|
||||
# make better help messages
|
||||
|
||||
# Mid-level
|
||||
# add logics to detect if debugger is attached
|
||||
# add input validation checks
|
||||
# - is ID an int?
|
||||
|
||||
# HARD!!
|
||||
# - re-introduce the -Duration option & use ScheduledJob instead of sleep
|
||||
|
||||
# Credits:
|
||||
# Shout out to Dave Kennedy for pointing me to this StackOverflow article.
|
||||
# https://stackoverflow.com/questions/11010165/how-to-suspend-resume-a-process-in-windows
|
||||
|
||||
# Reference links:
|
||||
# calling Windows API from PowerShell
|
||||
# https://blog.dantup.com/2013/10/easily-calling-windows-apis-from-powershell/
|
||||
|
||||
# https://blogs.technet.microsoft.com/heyscriptingguy/2013/06/25/use-powershell-to-interact-with-the-windows-api-part-1/
|
||||
|
||||
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms679295(v=vs.85).aspx
|
||||
|
||||
# Highly interesting article on how to use specific methods in a dll in PowerShell
|
||||
#https://social.technet.microsoft.com/Forums/ie/en-US/660c36b5-205c-47b6-8b98-aaa97d69a582/use-powershell-to-automate-powerpoint-document-repair-message-response?forum=winserverpowershell
|
||||
|
||||
|
||||
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
This is a PowerShell script which allows one to Pause-Process or
|
||||
UnPause-Process.
|
||||
|
||||
.DESCRIPTION
|
||||
This script will allow users to pause and unpause running commands. This is
|
||||
accomplished by attaching a debugger to the selected process. Removing the
|
||||
debugger allows the program to resume normal operation.
|
||||
|
||||
Note: not all programs can be paused in this manner.
|
||||
|
||||
.EXAMPLE
|
||||
Import-Module .\pause-process.ps1
|
||||
|
||||
.EXAMPLE
|
||||
Pause-Process -ID [PID]
|
||||
|
||||
.EXAMPLE
|
||||
UnPause-Process -ID [PID]
|
||||
|
||||
.NOTES
|
||||
This script is under active development.
|
||||
Until you are comfortable with how this works... DO NOT USE IN PRODUCTION!
|
||||
|
||||
.LINK
|
||||
https://infosecinnovations.com/Alpha-Testing
|
||||
|
||||
#>
|
||||
|
||||
|
||||
|
||||
$script:nativeMethods = @();
|
||||
function Register-NativeMethod([string]$dll, [string]$methodSignature)
|
||||
{
|
||||
$script:nativeMethods += [PSCustomObject]@{ Dll = $dll; Signature = $methodSignature; }
|
||||
}
|
||||
|
||||
function Add-NativeMethods()
|
||||
{
|
||||
$nativeMethodsCode = $script:nativeMethods | % { "
|
||||
[DllImport(`"$($_.Dll)`")]
|
||||
public static extern $($_.Signature);
|
||||
" }
|
||||
|
||||
Add-Type @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
public static class NativeMethods {
|
||||
$nativeMethodsCode
|
||||
}
|
||||
"@
|
||||
}
|
||||
|
||||
|
||||
# Add methods here
|
||||
Register-NativeMethod "kernel32.dll" "int DebugActiveProcess(int PID)"
|
||||
Register-NativeMethod "kernel32.dll" "int DebugActiveProcessStop(int PID)"
|
||||
|
||||
# This builds the class and registers them (you can only do this one-per-session, as the type cannot be unloaded?)
|
||||
Add-NativeMethods
|
||||
|
||||
|
||||
function Pause-Process {
|
||||
|
||||
[CmdletBinding()]
|
||||
|
||||
Param (
|
||||
[parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
|
||||
[alias("OwningProcess")]
|
||||
[int]$ID
|
||||
)
|
||||
|
||||
|
||||
Begin {
|
||||
# Test to see if this is a running process
|
||||
# Future feature: Do checks to see if we can pause this process.
|
||||
write-verbose ("you entered an ID of: $ID")
|
||||
}
|
||||
|
||||
|
||||
Process {
|
||||
$PauseResult = [NativeMethods]::DebugActiveProcess($ID)
|
||||
}
|
||||
|
||||
|
||||
End {
|
||||
if ($PauseResult -eq $False) {
|
||||
Write-Error ("Unable to pause process: $ID")
|
||||
|
||||
} else {
|
||||
Write-Verbose ("Process $ID was paused")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function UnPause-Process {
|
||||
|
||||
[CmdletBinding()]
|
||||
|
||||
Param (
|
||||
[parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
|
||||
[alias("OwningProcess")]
|
||||
[int]$ID
|
||||
)
|
||||
|
||||
Begin{
|
||||
Write-Verbose ("Attempting to unpause PID: $ID")
|
||||
}
|
||||
|
||||
|
||||
Process {
|
||||
# Attempt the unpause
|
||||
$UnPauseResult = [NativeMethods]::DebugActiveProcessStop($ID)
|
||||
}
|
||||
|
||||
End {
|
||||
if ($UnPauseResult -eq $False) {
|
||||
Write-Error ("unable to unpause process $ID. Is it running or gone?")
|
||||
|
||||
} else {
|
||||
Write-Verbose ("$ID was resumed")
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue