共用方式為


Marshal.SecureStringToGlobalAllocAnsi(SecureString) 方法

定義

重要

此 API 不符合 CLS 規範。

將 Managed SecureString 的內容複製到 Unmanaged 記憶體中,並在它複製時轉換成 ANSI 格式。

public:
 static IntPtr SecureStringToGlobalAllocAnsi(System::Security::SecureString ^ s);
public static IntPtr SecureStringToGlobalAllocAnsi (System.Security.SecureString s);
[System.CLSCompliant(false)]
public static IntPtr SecureStringToGlobalAllocAnsi (System.Security.SecureString s);
[System.Security.SecurityCritical]
public static IntPtr SecureStringToGlobalAllocAnsi (System.Security.SecureString s);
static member SecureStringToGlobalAllocAnsi : System.Security.SecureString -> nativeint
[<System.CLSCompliant(false)>]
static member SecureStringToGlobalAllocAnsi : System.Security.SecureString -> nativeint
[<System.Security.SecurityCritical>]
static member SecureStringToGlobalAllocAnsi : System.Security.SecureString -> nativeint
Public Shared Function SecureStringToGlobalAllocAnsi (s As SecureString) As IntPtr

參數

s
SecureString

要複製的 Managed 物件。

傳回

IntPtr

nativeint

Unmanaged 記憶體中複製 s 參數的目標位址;如果提供 Null 物件,則為 0。

屬性

例外狀況

s 參數為 null

可用的記憶體不足。

範例

下列範例會 SecureStringToGlobalAllocAnsi 使用 方法,將 對象的內容 SecureString 封送處理和解密為 Unmanaged 記憶體區塊。 然後它會 ZeroFreeGlobalAllocAnsi 使用 方法來零出並處置 Unmanaged 區塊。

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.SecureStringToGlobalAllocAnsi(passWord);
        passWord.Dispose();

        if (unmanagedRef != IntPtr.Zero) {
            Console.WriteLine("Zeroing out unmanaged memory...");
            Marshal.ZeroFreeGlobalAllocAnsi(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
    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.SecureStringToGlobalAllocAnsi(passWord)
        passWord.Dispose()

        If unmanagedRef <> IntPtr.Zero Then
            Console.WriteLine("Zeroing out unmanaged memory...")
            Marshal.ZeroFreeGlobalAllocAnsi(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.

備註

方法 SecureStringToGlobalAllocAnsi 適用於自定義封送處理,或在混合 Managed 和 Unmanaged 程式代碼時使用。 因為這個方法會配置字串所需的 Unmanaged 記憶體,所以一律會呼叫 ZeroFreeGlobalAllocAnsi 方法來釋放記憶體。

適用於