Ask Learn
Preview
Please sign in to use this experience.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.
Please sign in to use this experience.
Sign in