Consultar o código-fonte dos cmdlets do PowerShell

Hoje durante um treinamento um aluno me perguntou como consultar o código-fonte dos comandos do PowerShell.

Achei bem interessante a pergunta e resolvi compartilhar aqui com vocês.

Para quem não sabe, o PowerShell é desenvolvido sobre o .NET Framework. Assim, ele utiliza e estende o .NET Framework . Com isso, seus comandos estão compilados em DLLs gerenciadas (.NET Framework). Maiores detalhes em: post Introdução ao PowerShell.

O resultado é que os comandos do PowerShell não estão compilados em linguagem de máquina, e sim, na linguagem intermediária (IL) do .NET Framework. Maiores detalhes sobre IL em: Introdução à linguagem C# e ao .NET Framework.

Com isso fica fácil extrair o código-fonte das DLLs dos cmdlets do PowerShell.

Exemplo:

O comando Get-Date retorna a data e hora atual. Para obter o fonte, é necessário identificar onde está a DLL associada ao comando. Isso é possível via o comando a seguir:

(Get-Command get-date).DLL

 O segundo passo é identificar qual é o método da DLL que corresponde ao cmdlet get-date. Para tanto:

(Get-Command get-date).ImplementingType

Através desses comandos é possível obter os seguintes resultados:

DLL:

C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.PowerShell.Commands.Utility\v4.0_3.0.0.0__31bf3856ad364e35\Microsoft.PowerShell.Commands.Utility.dll

Método:

GetDateCommand

 Uma vez que temos a DLL e sabemos que a mesma é gerenciada (escrita em .NET e compilada na IL), é fácil consultar o código-fonte através de uma engenharia reversa. Existem diversas ferramentas para esse fim, eu vou utilizar a ILSpy que é gratuita.

Ao abrir a DLL via ILSpy, é possível consultar todos os métodos disponíveis na DLL. A figura a seguir exibe parte do código .NET do cmdlet Get-Date, no caso o GetDateCommand:

Get-Date

Espero que tenham gostado. Até a próxima.