advapi32/CloseServiceHandle.ps1

function CloseServiceHandle
{
<#
.SYNOPSIS
 
Closes a handle to a service control manager or service object.
 
Author: Will Schroeder (@harmj0y)
License: BSD 3-Clause
Required Dependencies: PSReflect
 
.DESCRIPTION
 
Closes a handle to a service control manager or service object using the
CloseServiceHandle Win32 API call.
 
.PARAMETER Handle
 
Handle to the service control manager object or the service object to close.
 
.NOTES
 
(func advapi32 CloseServiceHandle ([Int]) @(
    [IntPtr] # _In_ SC_HANDLE hSCObject
))
 
.LINK
 
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682028(v=vs.85).aspx
 
.EXAMPLE
 
#>

    
    [OutputType([IntPtr])]
    [CmdletBinding()]
    Param(
        [Parameter(Position = 0, Mandatory = $True, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)]
        [Alias('hSCObject')]
        [ValidateNotNullOrEmpty()]
        [IntPtr]
        $Handle
    )

    $Result = $Advapi32::CloseServiceHandle($Handle);$LastError = [Runtime.InteropServices.Marshal]::GetLastWin32Error()

    if ($Result -ne 0) {
        Write-Verbose "[CloseServiceHandle] Success in closing service handle '$Handle'"
    }
    else {
        throw "[CloseServiceHandle] CloseServiceHandle() Error: $(([ComponentModel.Win32Exception] $LastError).Message)"
    }
}