.NET: Unterschied zwischen den Versionen
Aus Wiki-WebPerfect
Admin (Diskussion | Beiträge) |
Admin (Diskussion | Beiträge) |
||
Zeile 9: | Zeile 9: | ||
== Call a Win32 API function with powershell == | == Call a Win32 API function with powershell == | ||
− | === Example: GetDriveTypeW === | + | === Example-Function: GetDriveTypeW === |
'''Using Add-Type to call the GetDriveTypeW function''' | '''Using Add-Type to call the GetDriveTypeW function''' | ||
<source lang="powershell"> | <source lang="powershell"> | ||
Zeile 25: | Zeile 25: | ||
'''Output''' | '''Output''' | ||
3 | 3 | ||
+ | |||
+ | |||
+ | === Example_Function: GetLogicalDriveStrings (running C# in PowerShell) === | ||
+ | <source lang="powershell"> | ||
+ | $code = @" | ||
+ | using System; | ||
+ | using System.Collections.Specialized; | ||
+ | using System.Runtime.InteropServices; | ||
+ | |||
+ | public class Mainline | ||
+ | { | ||
+ | [DllImport("kernel32.dll")] | ||
+ | static extern uint GetLogicalDriveStrings(uint nBufferLength, [Out] char[] lpBuffer); | ||
+ | |||
+ | public static void Main() | ||
+ | { | ||
+ | const int size = 512; | ||
+ | char[] buffer = new char[size]; | ||
+ | uint code = GetLogicalDriveStrings(size, buffer); | ||
+ | |||
+ | if (code == 0) | ||
+ | { | ||
+ | Console.WriteLine("Call failed"); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | StringCollection list = new StringCollection(); | ||
+ | int start = 0; | ||
+ | for (int i = 0; i < code; ++i) | ||
+ | { | ||
+ | if (buffer[i] == 0) | ||
+ | { | ||
+ | string s = new string(buffer, start, i - start); | ||
+ | list.Add(s); | ||
+ | start = i + 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | foreach (string s in list) | ||
+ | Console.WriteLine(s); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | "@ | ||
+ | |||
+ | Add-Type -TypeDefinition $code -Language CSharp | ||
+ | [Mainline]::main() | ||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | |||
'''Description''' | '''Description''' |
Version vom 14. April 2020, 14:29 Uhr
Inhaltsverzeichnis
Get all actual loaded .NET Assemblies (per PowerShell Session)
[System.AppDomain]::CurrentDomain.GetAssemblies()
Messagebox with Button
[System.Windows.Forms.MessageBox]::Show("Text","Überschrift",[System.Windows.Forms.MessageBoxButtons]::OK)
Call a Win32 API function with powershell
Example-Function: GetDriveTypeW
Using Add-Type to call the GetDriveTypeW function
$MethodDefinition = @' [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern int GetDriveTypeW(string lpRootPathName); '@ $Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru
Call the function with the paramter "C:\"
$Kernel32::GetDriveTypeW('C:\')
Output
3
Example_Function: GetLogicalDriveStrings (running C# in PowerShell)
$code = @" using System; using System.Collections.Specialized; using System.Runtime.InteropServices; public class Mainline { [DllImport("kernel32.dll")] static extern uint GetLogicalDriveStrings(uint nBufferLength, [Out] char[] lpBuffer); public static void Main() { const int size = 512; char[] buffer = new char[size]; uint code = GetLogicalDriveStrings(size, buffer); if (code == 0) { Console.WriteLine("Call failed"); return; } StringCollection list = new StringCollection(); int start = 0; for (int i = 0; i < code; ++i) { if (buffer[i] == 0) { string s = new string(buffer, start, i - start); list.Add(s); start = i + 1; } } foreach (string s in list) Console.WriteLine(s); } } "@ Add-Type -TypeDefinition $code -Language CSharp [Mainline]::main()
Description
The value 3 means "DRIVE_FIXED".
More informations in the documentation: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypew
Troubleshooting
Error "StringBuilder"
The type or namespace name 'StringBuilder' could not be found (are you missing a using directive or an assembly reference?)
Description
StringBuilder is defined in the System.Text namespace, but the using directive goes at the top of the program by the class definition. Since we’re letting PowerShell define the type for us, we can either rename it to System.Text.StringBuilder,
Solution
Replace StringBuilder with System.Text.StringBuilder.
More informations: