Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main() - uruchom kod C# prosto z PowerShella
Cmdlet Add-Type pozwala nam zdefiniować klasę .NET (lub .NET Core) dla bieżącej sesji PowerShella, którą następnie możemy wykorzystywać. Domyślnym językiem programowania dla klasy jest C#, jednak można to zmienić za pomocą parametru -Language. Kod źródłowy podajemy w parametrze -TypeDefinition (co możemy skrócić do -t). W wyniku uruchomienia tego onelinera, otrzymamy:
PS C:\Users\drg> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main()
Ciekawe te protipy!
PS C:\Users\drg>
Oczywiście możemy to zapisać w bardziej czytelny sposób:
$code = @"
public class Foo {
public static void Main() {
System.Console.WriteLine("Ciekawe te protipy!");
}
}
"@
Add-Type -TypeDefinition $code -Language CSharp
[Foo]::Main()
Kompilowanie do pliku wykonywalnego
Wykorzystując parametr -OutputAssembly możemy dokonać kompilacji do pliku wykonywalnego (np. .exe czy .dll). A zatem moglibyśmy wykonać coś takiego:
PS C:\Users\drg> Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}' -OutputAssembly foo.exe
PS C:\Users\drg> .\foo.exe
Ciekawe te protipy!
PS C:\Users\drg>
Polecam zapoznać się z manualem, ponieważ w ten sposób można kompilować zupełnie poważne programy.
Go deeper
Podczas takiej powiedzmy sobie niejawnej kompilacji, wykorzystywany jest domyślnie instalowany wraz z .NET kompilator csc.exe. Jeśli chcielibyście mieć na to niezbity dowód, możemy wykorzystać rejestrową sztuczkę z Debuggerem i ustawić Debugger dla csc.exe na przykład na calc.exe:
ni -f "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe" | sp -name Debugger -Value "calc.exe #"
Oczywiście, by dodać ten wpis musimy mieć uprawnienia administratora. Kiedy Debugger dla csc.exe jest zdefiniowany, kolejne wywołanie naszych przykładowych Add-Type nie zwróci oczekiwanych rezultatów, natomiast powinien uruchomić się kalkulator.
Więcej na ten temat przeczytasz w protipach 005d oraz 0008.
By posprzątać po sobie, możemy usunąć wartość Debugger dla csc.exe:
Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe" -Name Debugger
lub usunąć cały element csc.exe:
Remove-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csc.exe"