Partager via


WindowsIdentity.RunImpersonated Méthode

Définition

Surcharges

RunImpersonated(SafeAccessTokenHandle, Action)

Exécute l'action spécifiée en tant qu'identité Windows empruntée. Au lieu d'utiliser un appel de méthode emprunté et d'exécuter votre fonction dans WindowsImpersonationContext, vous pouvez utiliser RunImpersonated(SafeAccessTokenHandle, Action) et fournir votre fonction directement en tant que paramètre.

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

Exécute la fonction spécifiée en tant qu'identité Windows empruntée. Au lieu d'utiliser un appel de méthode emprunté et d'exécuter votre fonction dans WindowsImpersonationContext, vous pouvez utiliser RunImpersonated(SafeAccessTokenHandle, Action) et fournir votre fonction directement en tant que paramètre.

RunImpersonated(SafeAccessTokenHandle, Action)

Exécute l'action spécifiée en tant qu'identité Windows empruntée. Au lieu d'utiliser un appel de méthode emprunté et d'exécuter votre fonction dans WindowsImpersonationContext, vous pouvez utiliser RunImpersonated(SafeAccessTokenHandle, Action) et fournir votre fonction directement en tant que paramètre.

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)

Paramètres

safeAccessTokenHandle
SafeAccessTokenHandle

SafeAccessTokenHandle de l'identité Windows empruntée.

action
Action

System.Action à exécuter.

Exemples

L’exemple suivant illustre l’utilisation de la WindowsIdentity classe pour emprunter l’identité d’un utilisateur.

Avertissement

Cet exemple demande à l’utilisateur d’entrer un mot de passe sur l’écran de la console. Le mot de passe sera visible à l’écran, car la fenêtre de console ne prend pas en charge l’entrée masquée en mode natif.

// 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);
    }
}

Remarques

Notes

Cette méthode peut être utilisée de manière fiable avec le modèle async/await, contrairement à Impersonate. Dans une méthode asynchrone, la surcharge générique de cette méthode peut être utilisée avec un argument de délégué asynchrone afin que la tâche résultante puisse être attendue.

S’applique à

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

Exécute la fonction spécifiée en tant qu'identité Windows empruntée. Au lieu d'utiliser un appel de méthode emprunté et d'exécuter votre fonction dans WindowsImpersonationContext, vous pouvez utiliser RunImpersonated(SafeAccessTokenHandle, Action) et fournir votre fonction directement en tant que paramètre.

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

Paramètres de type

T

Type d'objet utilisé et retourné par la fonction.

Paramètres

safeAccessTokenHandle
SafeAccessTokenHandle

SafeAccessTokenHandle de l'identité Windows empruntée.

func
Func<T>

System.Func à exécuter.

Retours

T

Résultat de la fonction.

Exemples

L’exemple suivant illustre l’utilisation de la WindowsIdentity classe pour emprunter l’identité d’un utilisateur.

Avertissement

Cet exemple demande à l’utilisateur d’entrer un mot de passe sur l’écran de la console. Le mot de passe sera visible à l’écran, car la fenêtre de console ne prend pas en charge l’entrée masquée en mode natif.

// 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);
    }
}

Remarques

Notes

Cette méthode peut être utilisée de manière fiable avec le modèle async/await, contrairement à Impersonate. Dans une méthode asynchrone, cette méthode peut être utilisée avec un argument de délégué asynchrone afin que la tâche résultante puisse être attendue.

S’applique à