Protipy / PowerShell
Kolejny sposób blokowania ekranu PowerShellem
(Add-Type -m '[DllImport("user32.dll")]public static extern bool LockWorkStation();' -Name "Lock" -pas)::LockWorkStation()
Wstęp
Alternatywna wersja protipa /pl/0082 czyli blokowania ekranu PowerShellem. Różnica polega na tym, że zamiast tworzyć nową klasę cmdletem Add-Type z kodem źródłowym przekazanym do parametru -TypeDefinition, wykorzystujemy parametr -MemberDefinition (w skrócie -m), który pozwoli nam uzyskać dostęp do natywnych ("niezarządzalnych" - ang. unmanaged) funkcji biblioteki napisanej w dowolnym języku. Dla chcących zgłębić temat, wykorzystywany jest mechanizm P/Invoke.
Parametr -pas czyli -PassThru spowoduje, że Add-Type zwróci nam obiekt reprezentujący dodane typy, przec co możemy od razu się do niego odwołać ( ::LockWorkStation()) bez konieczności tworzenia dodatkowej zmiennej.
Być może nieco bardziej czytelną formą będzie:
$sig = '[DllImport("user32.dll")]public static extern bool LockWorkStation();'
$User32LockWorkStation = Add-Type -MemberDefinition $sig -Name "Lock" -PassThru
$User32LockWorkStation::LockWorkStation()
Ponownie warto pamiętać, że w tle uruchomi się kompilator csc.exe, zgodnie z tym co omawialiśmy przy okazji protipa /pl/007f.
Linki
- web · learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/add-type — dokumentacja cmdletu Add-Type
- web · https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke — mechanizm Platform invoke (P/Invoke)
- protip · aptm.in/protip/0081 — rundll32 user32,LockWorkStation - zablokuj ekran z wiersza poleceń
- protip · aptm.in/protip/0082 — Add-Type -t 'public class User32 {[System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool LockWorkStation();}'; [User32]::LockWorkStation() - zablokuj ekran PowerShellem
- protip · aptm.in/protip/007f — Add-Type -t 'public class Foo { public static void Main(){ System.Console.WriteLine("Ciekawe te protipy!");}}';[Foo]::Main() - uruchom kod C# prosto z PowerShella