Marshal.SecureStringToGlobalAllocAnsi(SecureString) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Importante
Questa API non è conforme a CLS.
Copia il contenuto di un oggetto SecureString gestito nella memoria non gestita, effettuando contemporaneamente la conversione nel formato 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
Parametri
Oggetto gestito da copiare.
Restituisce
nativeint
Indirizzo, nella memoria non gestita, in cui è stato copiato il parametro s
, oppure 0 se è stato fornito un oggetto Null.
- Attributi
Eccezioni
Il valore del parametro s
è null
.
La memoria disponibile è insufficiente.
Esempio
Nell'esempio seguente viene usato il metodo per eseguire il marshalling e decrittografare il SecureStringToGlobalAllocAnsi contenuto di un SecureString oggetto in un blocco di memoria non gestita. Usa quindi il metodo per zero e elimina il ZeroFreeGlobalAllocAnsi blocco non gestito.
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.
Commenti
Il SecureStringToGlobalAllocAnsi metodo è utile per il marshalling personalizzato o quando si combina codice gestito e non gestito. Poiché questo metodo alloca la memoria non gestita necessaria per una stringa, libera sempre la memoria chiamando il ZeroFreeGlobalAllocAnsi metodo .