WindowsIdentity.RunImpersonated Metodo

Definizione

Overload

RunImpersonated(SafeAccessTokenHandle, Action)

Esegue l'azione specificata come identità Windows rappresentata. Anziché usare una chiamata al metodo rappresentato ed eseguire la funzione in WindowsImpersonationContext, è possibile usare RunImpersonated(SafeAccessTokenHandle, Action) e fornire la funzione direttamente come parametro.

RunImpersonated<T>(SafeAccessTokenHandle, Func<T>)

Esegue la funzione specificata come identità Windows rappresentata. Anziché usare una chiamata al metodo rappresentato ed eseguire la funzione in WindowsImpersonationContext, è possibile usare RunImpersonated(SafeAccessTokenHandle, Action) e fornire la funzione direttamente come parametro.

RunImpersonated(SafeAccessTokenHandle, Action)

Esegue l'azione specificata come identità Windows rappresentata. Anziché usare una chiamata al metodo rappresentato ed eseguire la funzione in WindowsImpersonationContext, è possibile usare RunImpersonated(SafeAccessTokenHandle, Action) e fornire la funzione direttamente come parametro.

public:
 static void RunImpersonated(Microsoft::Win32::SafeHandles::SafeAccessTokenHandle ^ safeAccessTokenHandle, Action ^ action);
public static void RunImpersonated (Microsoft.Win32.SafeHandles.SafeAccessTokenHandle safeAccessTokenHandle, Action action);
static member RunImpersonated : Microsoft.Win32.SafeHandles.SafeAccessTokenHandle * Action -> unit
Public Shared Sub RunImpersonated (safeAccessTokenHandle As SafeAccessTokenHandle, action As Action)

Parametri

safeAccessTokenHandle
SafeAccessTokenHandle

Oggetto SafeAccessTokenHandle dell'identità Windows rappresentata.

action
Action

System.Action da eseguire.

Esempio

Nell'esempio seguente viene illustrato l'uso della WindowsIdentity classe per rappresentare un utente.

Avviso

Questo esempio chiede all'utente di immettere una password nella schermata della console. La password sarà visibile sullo schermo, perché la finestra della console non supporta l'input mascherato in modo nativo.

// The following example demonstrates the use of the WindowsIdentity class to impersonate a user.
// IMPORTANT NOTE:
// This sample asks the user to enter a password on the console screen.
// The password will be visible on the screen, because the console window
// does not support masked input natively.

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Principal;
using Microsoft.Win32.SafeHandles;

public class ImpersonationDemo
{
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, out SafeAccessTokenHandle phToken);

    public static void Main()
    {
        // Get the user token for the specified user, domain, and password using the
        // unmanaged LogonUser method.
        // The local machine name can be used for the domain name to impersonate a user on this machine.
        Console.Write("Enter the name of the domain on which to log on: ");
        string domainName = Console.ReadLine();

        Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName);
        string userName = Console.ReadLine();

        Console.Write("Enter the password for {0}: ", userName);

        const int LOGON32_PROVIDER_DEFAULT = 0;
        //This parameter causes LogonUser to create a primary token.
        const int LOGON32_LOGON_INTERACTIVE = 2;

        // Call LogonUser to obtain a handle to an access token.
        SafeAccessTokenHandle safeAccessTokenHandle;
        bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
            out safeAccessTokenHandle);

        if (false == returnValue)
        {
            int ret = Marshal.GetLastWin32Error();
            Console.WriteLine("LogonUser failed with error code : {0}", ret);
            throw new System.ComponentModel.Win32Exception(ret);
        }

        Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
        // Check the identity.
        Console.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name);

        // Note: if you want to run as unimpersonated, pass
        //       'SafeAccessTokenHandle.InvalidHandle' instead of variable 'safeAccessTokenHandle'
        WindowsIdentity.RunImpersonated(
            safeAccessTokenHandle,
            // User action
            () =>
            {
                // Check the identity.
                Console.WriteLine("During impersonation: " + WindowsIdentity.GetCurrent().Name);
            }
            );

        // Check the identity again.
        Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
    }
}

Commenti

Nota

Questo metodo può essere usato in modo affidabile con il modello async/await, a differenza di Impersonate. In un metodo asincrono, l'overload generico di questo metodo può essere usato con un argomento delegato asincrono in modo che l'attività risultante possa essere attesa.

Si applica a

RunImpersonated<T>(SafeAccessTokenHandle, Func<T>)

Esegue la funzione specificata come identità Windows rappresentata. Anziché usare una chiamata al metodo rappresentato ed eseguire la funzione in WindowsImpersonationContext, è possibile usare RunImpersonated(SafeAccessTokenHandle, Action) e fornire la funzione direttamente come parametro.

public:
generic <typename T>
 static T RunImpersonated(Microsoft::Win32::SafeHandles::SafeAccessTokenHandle ^ safeAccessTokenHandle, Func<T> ^ func);
public static T RunImpersonated<T> (Microsoft.Win32.SafeHandles.SafeAccessTokenHandle safeAccessTokenHandle, Func<T> func);
static member RunImpersonated : Microsoft.Win32.SafeHandles.SafeAccessTokenHandle * Func<'T> -> 'T
Public Shared Function RunImpersonated(Of T) (safeAccessTokenHandle As SafeAccessTokenHandle, func As Func(Of T)) As T

Parametri di tipo

T

Tipo di oggetto usato e restituito dalla funzione.

Parametri

safeAccessTokenHandle
SafeAccessTokenHandle

Oggetto SafeAccessTokenHandle dell'identità Windows rappresentata.

func
Func<T>

System.Func da eseguire.

Restituisce

T

Risultato della funzione.

Esempio

Nell'esempio seguente viene illustrato l'uso della WindowsIdentity classe per rappresentare un utente.

Avviso

Questo esempio chiede all'utente di immettere una password nella schermata della console. La password sarà visibile sullo schermo, perché la finestra della console non supporta l'input mascherato in modo nativo.

// The following example demonstrates the use of the WindowsIdentity class to impersonate a user.
// IMPORTANT NOTE:
// This sample asks the user to enter a password on the console screen.
// The password will be visible on the screen, because the console window
// does not support masked input natively.

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Principal;
using Microsoft.Win32.SafeHandles;

public class ImpersonationDemo
{
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, out SafeAccessTokenHandle phToken);

    public static void Main()
    {
        // Get the user token for the specified user, domain, and password using the
        // unmanaged LogonUser method.
        // The local machine name can be used for the domain name to impersonate a user on this machine.
        Console.Write("Enter the name of the domain on which to log on: ");
        string domainName = Console.ReadLine();

        Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName);
        string userName = Console.ReadLine();

        Console.Write("Enter the password for {0}: ", userName);

        const int LOGON32_PROVIDER_DEFAULT = 0;
        //This parameter causes LogonUser to create a primary token.
        const int LOGON32_LOGON_INTERACTIVE = 2;

        // Call LogonUser to obtain a handle to an access token.
        SafeAccessTokenHandle safeAccessTokenHandle;
        bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
            out safeAccessTokenHandle);

        if (false == returnValue)
        {
            int ret = Marshal.GetLastWin32Error();
            Console.WriteLine("LogonUser failed with error code : {0}", ret);
            throw new System.ComponentModel.Win32Exception(ret);
        }

        Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
        // Check the identity.
        Console.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name);

        // Note: if you want to run as unimpersonated, pass
        //       'SafeAccessTokenHandle.InvalidHandle' instead of variable 'safeAccessTokenHandle'
        WindowsIdentity.RunImpersonated(
            safeAccessTokenHandle,
            // User action
            () =>
            {
                // Check the identity.
                Console.WriteLine("During impersonation: " + WindowsIdentity.GetCurrent().Name);
            }
            );

        // Check the identity again.
        Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
    }
}

Commenti

Nota

Questo metodo può essere usato in modo affidabile con il modello async/await, a differenza di Impersonate. In un metodo asincrono, questo metodo può essere usato con un argomento delegato asincrono in modo che l'attività risultante possa essere attesa.

Si applica a