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:
Espero que tenham gostado. Até a próxima.
Comments
- Anonymous
August 31, 2017
Agora o Powershell tem os fontes publicados em: https://github.com/PowerShell/PowerShell .