lib/utils.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using namespace System.ComponentModel
using namespace System.Security.Principal

function ConvertTo-ErrMessage {
  [CmdletBinding(DefaultParameterSetName='WinNt')]
  param(
    [Parameter(Mandatory, ParameterSetName='WinNt', Position=0)]
    [Int32]$WinNt,

    [Parameter(Mandatory, ParameterSetName='NtStatus', Position=0)]
    [Int32]$NtStatus
  )

  end {
    [Win32Exception]::new(
      $WinNt ? $WinNt : $(
        New-Delegate ntdll { int RtlNtStatusToDosError([int]) }
        $ntdll.RtlNtStatusToDosError.Invoke($NtStatus)
      )
    ).Message
  }
}

function New-PsProxy {
  [CmdletBinding(DefaultParameterSetName='Name')]
  param(
    [Parameter(Mandatory, ParameterSetName='Name', Position=0)]
    [ValidateNotNullOrEmpty()]
    [String[]]$Name,

    [Parameter(Mandatory, ParameterSetName='Id', Position=0)]
    [Alias('PID')]
    [Int32[]]$Id,

    [Parameter(Mandatory, Position=1)]
    [ValidateScript({![String]::IsNullOrEmpty($_)})]
    [ScriptBlock]$Callback
  )

  begin {
    if ($PSBoundParameters.Callback) {
      [void]$PSBoundParameters.Remove('Callback')
    }
    $PSBoundParameters.Add('OutVariable', 'ps')

    $cmd = {Out-Null -InputObject (&(
      Get-Command -CommandType Cmdlet -Name Get-Process
    ) @PSBoundParameters)}.GetSteppablePipeline($MyInvocation.CommandOrigin)
    $cmd.Begin($PSCmdlet)
  }
  process { $cmd.Process($_) }
  end {
    $cmd.End()
    $ps.ForEach{
      .$Callback $_
      $_.Dispose()
    }
  }
}

function Test-IsAdmin {
  end {
    [WindowsPrincipal]::new(
      [WindowsIdentity]::GetCurrent()
    ).IsInRole([WindowsBuiltInRole]::Administrator)
  }
}