WindowsIdentity.RunImpersonated Methode

Definitie

Overloads

Name Description
RunImpersonated(SafeAccessTokenHandle, Action)

Hiermee wordt de opgegeven actie uitgevoerd als de geïmiteerde Windows identiteit. In plaats van een aanroep van een geïmiteerde methode te gebruiken en uw functie WindowsImpersonationContextuit te voeren, kunt u uw functie rechtstreeks als parameter gebruiken RunImpersonated(SafeAccessTokenHandle, Action) en opgeven.

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

Hiermee wordt de opgegeven functie uitgevoerd als de geïmiteerde Windows identiteit. In plaats van een aanroep van een geïmiteerde methode te gebruiken en uw functie WindowsImpersonationContextuit te voeren, kunt u uw functie rechtstreeks als parameter gebruiken RunImpersonated(SafeAccessTokenHandle, Action) en opgeven.

RunImpersonated(SafeAccessTokenHandle, Action)

Hiermee wordt de opgegeven actie uitgevoerd als de geïmiteerde Windows identiteit. In plaats van een aanroep van een geïmiteerde methode te gebruiken en uw functie WindowsImpersonationContextuit te voeren, kunt u uw functie rechtstreeks als parameter gebruiken RunImpersonated(SafeAccessTokenHandle, Action) en opgeven.

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)

Parameters

safeAccessTokenHandle
SafeAccessTokenHandle

De SafeAccessTokenHandle van de geïmiteerde Windows identiteit.

action
Action

De System.Action die moet worden uitgevoerd.

Voorbeelden

In het volgende voorbeeld ziet u het gebruik van de WindowsIdentity klasse om een gebruiker te imiteren.

Waarschuwing

In dit voorbeeld wordt de gebruiker gevraagd een wachtwoord in te voeren op het consolescherm. Het wachtwoord is zichtbaar op het scherm, omdat het consolevenster geen systeemeigen gemaskeerde invoer ondersteunt.

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

Opmerkingen

Note

Deze methode kan betrouwbaar worden gebruikt met het async/await-patroon, in tegenstelling tot Impersonate. In een asynchrone methode kan de algemene overbelasting van deze methode worden gebruikt met een asynchroon gedelegeerde argument, zodat de resulterende taak kan worden gewacht.

Van toepassing op

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

Hiermee wordt de opgegeven functie uitgevoerd als de geïmiteerde Windows identiteit. In plaats van een aanroep van een geïmiteerde methode te gebruiken en uw functie WindowsImpersonationContextuit te voeren, kunt u uw functie rechtstreeks als parameter gebruiken RunImpersonated(SafeAccessTokenHandle, Action) en opgeven.

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

Type parameters

T

Het type object dat door de functie wordt gebruikt en geretourneerd.

Parameters

safeAccessTokenHandle
SafeAccessTokenHandle

De SafeAccessTokenHandle van de geïmiteerde Windows identiteit.

func
Func<T>

De System.Func die moet worden uitgevoerd.

Retouren

T

Het resultaat van de functie.

Voorbeelden

In het volgende voorbeeld ziet u het gebruik van de WindowsIdentity klasse om een gebruiker te imiteren.

Waarschuwing

In dit voorbeeld wordt de gebruiker gevraagd een wachtwoord in te voeren op het consolescherm. Het wachtwoord is zichtbaar op het scherm, omdat het consolevenster geen systeemeigen gemaskeerde invoer ondersteunt.

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

Opmerkingen

Note

Deze methode kan betrouwbaar worden gebruikt met het async/await-patroon, in tegenstelling tot Impersonate. In een asynchrone methode kan deze methode worden gebruikt met een asynchroon gemachtigde argument, zodat de resulterende taak kan worden gewacht.

Van toepassing op