Marshal.SecureStringToCoTaskMemUnicode-Methode: (SecureString)
Veröffentlicht: Juli 2016
Kopiert den Inhalt eines verwalteten SecureString-Objekts in einen Speicherblock, der von der nicht verwalteten Speicherbelegung für COM-Aufgaben reserviert wurde.
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)
Syntax
[SecurityCriticalAttribute]
public static IntPtr SecureStringToCoTaskMemUnicode(
SecureString s
)
public:
[SecurityCriticalAttribute]
static IntPtr SecureStringToCoTaskMemUnicode(
SecureString^ s
)
[<SecurityCriticalAttribute>]
static member SecureStringToCoTaskMemUnicode :
s:SecureString -> nativeint
<SecurityCriticalAttribute>
Public Shared Function SecureStringToCoTaskMemUnicode (
s As SecureString
) As IntPtr
Parameter
s
Type: System.Security.SecureStringDas zu kopierende verwaltete Objekt.
Rückgabewert
Type: System.IntPtr
Die Adresse im nicht verwalteten Speicher, in die der s-Parameter kopiert wurde, oder 0, wenn ein NULL-Objekt bereitgestellt wurde.
Ausnahmen
Exception | Condition |
---|---|
ArgumentNullException | Der s-Parameter ist null. |
NotSupportedException | Auf dem aktuellen Computer wird nicht Windows 2000 Service Pack 3 oder höher ausgeführt. |
OutOfMemoryException | Es ist nicht genügend Arbeitsspeicher verfügbar. |
Hinweise
The M:System.Runtime.InteropServices.Marshal.SecureStringToCoTaskMemUnicode(System.Security.SecureString) method is useful for custom marshaling or when mixing managed and unmanaged code. Because this method allocates the unmanaged memory required for a string, always free the memory by calling the M:System.Runtime.InteropServices.Marshal.ZeroFreeCoTaskMemUnicode(System.IntPtr) method. The characters of the string are copied as Unicode characters.
Hinweise für Aufrufer:
This method is supported only on computers running Windows 2000 Service Pack 3 or later.
Beispiele
The following example uses the M:System.Runtime.InteropServices.Marshal.SecureStringToCoTaskMemUnicode(System.Security.SecureString) method to marshal and decrypt the contents of a T:System.Security.SecureString object to a block of unmanaged memory. It then uses the M:System.Runtime.InteropServices.Marshal.ZeroFreeCoTaskMemUnicode(System.IntPtr) method to zero out and dispose the unmanaged block.
using System;
using System.Runtime.InteropServices;
using System.Security;
class Example
{
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.SecureStringToCoTaskMemUnicode(passWord);
passWord.Dispose();
if (unmanagedRef != IntPtr.Zero) {
Console.WriteLine("Zeroing out unmanaged memory...");
Marshal.ZeroFreeCoTaskMemUnicode(unmanagedRef);
}
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;
}
}
// The example displays output like the following:
// Please enter your password: **********
// Copying and decrypting the string to unmanaged memory...
// Zeroing out unmanaged memory...
// Done.
Imports System.Runtime.InteropServices
Imports System.Security
Module Example
Public 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.SecureStringToCoTaskMemUnicode(passWord)
passWord.Dispose()
If unmanagedRef <> IntPtr.Size Then
Console.WriteLine("Zeroing out unmanaged memory...")
Marshal.ZeroFreeCoTaskMemUnicode(unmanagedRef)
End If
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
' The example displays output like the following:
' Please enter your password: **********
' Copying and decrypting the string to unmanaged memory...
' Zeroing out unmanaged memory...
' Done.
Sicherheit
requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.
Versionsinformationen
.NET Framework
Verfügbar seit 2.0
Siehe auch
Marshal-Klasse
System.Runtime.InteropServices-Namespace
Zurück zum Anfang