Marshal.SecureStringToGlobalAllocAnsi Method

Copies the contents of a managed SecureString into unmanaged memory, converting into ANSI format as it copies.

Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)

Public Shared Function SecureStringToGlobalAllocAnsi ( _
	s As SecureString _
) As IntPtr
Dim s As SecureString
Dim returnValue As IntPtr

returnValue = Marshal.SecureStringToGlobalAllocAnsi(s)
public static IntPtr SecureStringToGlobalAllocAnsi (
	SecureString s
public static function SecureStringToGlobalAllocAnsi (
	s : SecureString
) : IntPtr
Not applicable.



The managed SecureString to be copied.

Return Value

The address, in unmanaged memory, to where the s parameter was copied, or 0 if a null SecureString was supplied.

Exception typeCondition


The s parameter is a null reference (Nothing in Visual Basic).


The current computer is not running Microsoft Windows 2000 Service Pack 3 or later.


There is insufficient memory available.

The SecureStringToGlobalAllocAnsi 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 ZeroFreeGlobalAllocAnsi method.


This method uses SecurityAction.LinkDemand to prevent it from being called from untrusted code; only the immediate caller is required to have SecurityPermissionAttribute.UnmanagedCode permission. If your code can be called from partially trusted code, do not pass user input to Marshal class methods without validation. For important limitations on using the LinkDemand member, see Demand vs. LinkDemand.

Notes to Callers: This method is supported only on computers running Microsoft Windows 2000 Service Pack 3 or later.

The following code example uses the SecureStringToGlobalAllocAnsi method to marshal and decrypt the contents of a SecureString object to a block of unmanaged memory. It then uses the ZeroFreeGlobalAllocAnsi method to zero out and dispose the unmanaged block.

Imports System
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Imports System.Security
Imports System.Security.Principal
Imports System.Text

Module MarshalExample

    Sub Main(ByVal args() As String)

        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)

        Catch e As Exception
            If unmanagedRef <> IntPtr.Zero Then

                Console.WriteLine("Zeroing out unmanaged memory...")


            End If

        End Try



    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(" ")
                End If
            End If

            nextKey = Console.ReadKey(True)
        End While


        ' lock the password down
        Return password

    End Function
End Module

Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.

.NET Framework

Supported in: 3.0, 2.0