Sdílet prostřednictvím


WindowsIdentity.RunImpersonated Metoda

Definice

Přetížení

RunImpersonated(SafeAccessTokenHandle, Action)

Spustí zadanou akci jako zosobněnou identitu Windows. Místo použití volání zosobněné metody a spuštění funkce v WindowsImpersonationContextnástroji můžete funkci použít RunImpersonated(SafeAccessTokenHandle, Action) a poskytnout přímo jako parametr.

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

Spustí zadanou funkci jako zosobněnou identitu Systému Windows. Místo použití volání zosobněné metody a spuštění funkce v WindowsImpersonationContextnástroji můžete funkci použít RunImpersonated(SafeAccessTokenHandle, Action) a poskytnout přímo jako parametr.

RunImpersonated(SafeAccessTokenHandle, Action)

Spustí zadanou akci jako zosobněnou identitu Windows. Místo použití volání zosobněné metody a spuštění funkce v WindowsImpersonationContextnástroji můžete funkci použít RunImpersonated(SafeAccessTokenHandle, Action) a poskytnout přímo jako parametr.

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)

Parametry

safeAccessTokenHandle
SafeAccessTokenHandle

SafeAccessTokenHandle zosobněné identity Systému Windows.

action
Action

System.Action, která se má spustit.

Příklady

Následující příklad ukazuje použití WindowsIdentity třídy k zosobnění uživatele.

Upozornění

Tato ukázka vyzve uživatele, aby na obrazovce konzoly zadal heslo. Heslo bude viditelné na obrazovce, protože okno konzoly nativně nepodporuje maskované zadávání.

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

Poznámky

Poznámka

Tuto metodu lze spolehlivě použít se vzorem async/await, na rozdíl od Impersonate. V asynchronní metodě může být obecné přetížení této metody použito s argumentem asynchronního delegáta, takže výsledný úkol může být očekáván.

Platí pro

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

Spustí zadanou funkci jako zosobněnou identitu Systému Windows. Místo použití volání zosobněné metody a spuštění funkce v WindowsImpersonationContextnástroji můžete funkci použít RunImpersonated(SafeAccessTokenHandle, Action) a poskytnout přímo jako parametr.

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

Parametry typu

T

Typ objektu, který funkce používá a vrací.

Parametry

safeAccessTokenHandle
SafeAccessTokenHandle

SafeAccessTokenHandle zosobněné identity Systému Windows.

func
Func<T>

System.Func, který se má spustit.

Návraty

T

Výsledek funkce.

Příklady

Následující příklad ukazuje použití WindowsIdentity třídy k zosobnění uživatele.

Upozornění

Tato ukázka vyzve uživatele, aby na obrazovce konzoly zadal heslo. Heslo bude viditelné na obrazovce, protože okno konzoly nativně nepodporuje maskované zadávání.

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

Poznámky

Poznámka

Tuto metodu lze spolehlivě použít se vzorem async/await, na rozdíl od Impersonate. V asynchronní metodě lze tuto metodu použít s argumentem asynchronního delegáta, aby mohl být výsledný úkol očekáván.

Platí pro