Marshal.SecureStringToCoTaskMemAnsi(SecureString) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Belangrijk
Deze API is niet CLS-conform.
Hiermee kopieert u de inhoud van een beheerd SecureString object naar een blok geheugen dat is toegewezen vanuit de niet-beheerde COM-taaktoewijzing.
public:
static IntPtr SecureStringToCoTaskMemAnsi(System::Security::SecureString ^ s);
public static IntPtr SecureStringToCoTaskMemAnsi(System.Security.SecureString s);
[System.Security.SecurityCritical]
public static IntPtr SecureStringToCoTaskMemAnsi(System.Security.SecureString s);
[System.CLSCompliant(false)]
public static IntPtr SecureStringToCoTaskMemAnsi(System.Security.SecureString s);
static member SecureStringToCoTaskMemAnsi : System.Security.SecureString -> nativeint
[<System.Security.SecurityCritical>]
static member SecureStringToCoTaskMemAnsi : System.Security.SecureString -> nativeint
[<System.CLSCompliant(false)>]
static member SecureStringToCoTaskMemAnsi : System.Security.SecureString -> nativeint
Public Shared Function SecureStringToCoTaskMemAnsi (s As SecureString) As IntPtr
Parameters
Het beheerde object dat moet worden gekopieerd.
Retouren
nativeint
Het adres, in niet-beheerd geheugen, waarnaar de s parameter is gekopieerd, of 0 als er een null-object is opgegeven.
- Kenmerken
Uitzonderingen
De s parameter is null.
Er is onvoldoende geheugen beschikbaar.
Voorbeelden
In het volgende voorbeeld wordt de SecureStringToCoTaskMemAnsi methode gebruikt om de inhoud van een SecureString object te ontsleutelen naar een blok onbeheerd geheugen. Vervolgens wordt de ZeroFreeCoTaskMemAnsi methode gebruikt om het niet-beheerde blok uit te voeren en te verwijderen.
using System;
using System.Runtime.InteropServices;
using System.Security;
class MarshalExample
{
static void Main()
{
IntPtr unmanagedRef = IntPtr.Zero;
// Ask the user for a password.
Console.Write("Please enter your password: ");
SecureString passWord = GetPassword();
Console.WriteLine("Copying and decrypting the string to unmanaged memory...");
// Copy the Secure string to unmanaged memory (and decrypt it).
unmanagedRef = Marshal.SecureStringToCoTaskMemAnsi(passWord);
if (unmanagedRef != IntPtr.Zero)
{
Console.WriteLine("Zeroing out unmanaged memory...");
Marshal.ZeroFreeCoTaskMemAnsi(unmanagedRef);
}
passWord.Dispose();
Console.WriteLine("Done.");
}
public static SecureString GetPassword()
{
SecureString password = new SecureString();
// get the first character of the password
ConsoleKeyInfo nextKey = Console.ReadKey(true);
while (nextKey.Key != ConsoleKey.Enter)
{
if (nextKey.Key == ConsoleKey.Backspace)
{
if (password.Length > 0)
{
password.RemoveAt(password.Length - 1);
// erase the last * as well
Console.Write(nextKey.KeyChar);
Console.Write(" ");
Console.Write(nextKey.KeyChar);
}
}
else
{
password.AppendChar(nextKey.KeyChar);
Console.Write("*");
}
nextKey = Console.ReadKey(true);
}
Console.WriteLine();
// lock the password down
password.MakeReadOnly();
return password;
}
}
Imports System.Runtime.InteropServices
Imports System.Security
Module Example
Sub Main()
Dim unmanagedRef As IntPtr
' Ask the user for a password.
Console.Write("Please enter your password: ")
Dim passWord As SecureString = GetPassword()
Console.WriteLine("Copying and decrypting the string to unmanaged memory...")
' Copy the Secure string to unmanaged memory (and decrypt it).
unmanagedRef = Marshal.SecureStringToCoTaskMemAnsi(passWord)
If unmanagedRef <> IntPtr.Size Then
Console.WriteLine("Zeroing out unmanaged memory...")
Marshal.ZeroFreeCoTaskMemAnsi(unmanagedRef)
End If
passWord.Dispose()
Console.WriteLine("Done.")
End Sub
Function GetPassword() As SecureString
Dim password As New SecureString()
' get the first character of the password
Dim nextKey As ConsoleKeyInfo = Console.ReadKey(True)
While nextKey.Key <> ConsoleKey.Enter
If nextKey.Key = ConsoleKey.BackSpace Then
If password.Length > 0 Then
password.RemoveAt(password.Length - 1)
' erase the last * as well
Console.Write(nextKey.KeyChar)
Console.Write(" ")
Console.Write(nextKey.KeyChar)
End If
Else
password.AppendChar(nextKey.KeyChar)
Console.Write("*")
End If
nextKey = Console.ReadKey(True)
End While
Console.WriteLine()
' lock the password down
password.MakeReadOnly()
Return password
End Function
End Module
Opmerkingen
De SecureStringToCoTaskMemAnsi methode is handig voor aangepaste marshaling of bij het combineren van beheerde en onbeheerde code. Omdat met deze methode het niet-beheerde geheugen wordt toegewezen dat is vereist voor een tekenreeks, kunt u altijd het geheugen vrijmaken door aan te roepen ZeroFreeCoTaskMemAnsi. De tekens van de tekenreeks worden gekopieerd als ANSI-tekens.