Freigeben über


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

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

SecurityCriticalAttribute

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