Как декомпилировать командлет PowerShell? - PullRequest
0 голосов
/ 11 февраля 2020

У меня на работе одна ситуация, когда мне нужно декомпилировать командлет Powershell, возможно, в код. net c#. Я нашел эту информацию (https://yoursandmyideas.com/2014/12/30/decompiling-powershell-cmdlet-code/), но после нее я могу видеть только код функции, а не DLL. Статье около 5 лет, есть ли другой способ сделать это с более новыми версиями Powershell? Моя конечная цель состоит в том, чтобы декомпилировать dll, чтобы я мог пошагово пройти по коду и устранить проблему, с которой мы сталкиваемся в Visual Studio, строка за строкой.

(Get-Command Get-ServerHealth).DLL также ничего не возвращает

Ниже приведен функция внутри get-serverhealth, командлет Exchange. Вы видите, что он ссылается на другие функции, которые я не могу найти?

  • Get-PSImplicitRemotingClientSideParameters
  • Get-PSImplicitRemotingSession

Функция:

#Name        : Get-ServerHealth
#CommandType : Function
#Definition  :
Function Get-ServerHealth
{
  param(

  [Alias('ea')]
  ${ErrorAction},

  [Alias('vb')]
  [switch]
  ${Verbose},

  [Alias('ov')]
  ${OutVariable},

  [Alias('infa')]
  ${InformationAction},

  [Alias('wv')]
  ${WarningVariable},

  [Alias('db')]
  [switch]
  ${Debug},

  [Alias('pv')]
  ${PipelineVariable},

  ${HealthSet},

  [Alias('ev')]
  ${ErrorVariable},

  [Alias('Server')]
  ${Identity},

  [Alias('ob')]
  ${OutBuffer},

  [Alias('wa')]
  ${WarningAction},

  [switch]
  ${HaImpactingOnly},

  [Alias('iv')]
  ${InformationVariable},

  [switch]
  ${AsJob})

  Begin {
      try 
      {
          $positionalArguments = & $script:NewObject collections.arraylist
          foreach ($parameterName in $PSBoundParameters.BoundPositionally)
          {
              $null = $positionalArguments.Add( $PSBoundParameters[$parameterName] )
              $null = $PSBoundParameters.Remove($parameterName)
          }
          $positionalArguments.AddRange($args)

          $clientSideParameters = Get-PSImplicitRemotingClientSideParameters $PSBoundParameters $True

          $scriptCmd = { & $script:InvokeCommand `
                          @clientSideParameters `
                          -HideComputerName `
                          -Session (Get-PSImplicitRemotingSession -CommandName 'Get-ServerHealth') `
                          -Arg ('Get-ServerHealth', $PSBoundParameters, $positionalArguments) `
                          -Script { param($name, $boundParams, $unboundParams) & $name @boundParams @unboundParams } `
                       }

          $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
          $steppablePipeline.Begin($myInvocation.ExpectingInput, $ExecutionContext)
      } 
      catch 
      {
          throw
      }
  }
  Process 
  {
      try 
      {
          $steppablePipeline.Process($_)
      } 
      catch 
      {
          throw
      }
  }
  End 
  {
    try 
    {
      $steppablePipeline.End()
    } 
    catch 
    {
      throw
    }
  }

                  # .ForwardHelpTargetName Get-ServerHealth
                  # .ForwardHelpCategory Function
                  # .RemoteHelpRunspace PSSession

}
...