WindowsIdentity.RunImpersonated Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Sobrecargas
RunImpersonated(SafeAccessTokenHandle, Action) |
Ejecuta la acción especificada como identidad de Windows suplantada. En lugar de usar una llamada al método suplantado y ejecutar la función en WindowsImpersonationContext, puede usar RunImpersonated(SafeAccessTokenHandle, Action) y proporcionar la función directamente como parámetro. |
RunImpersonated<T>(SafeAccessTokenHandle, Func<T>) |
Ejecuta la función especificada como identidad de Windows suplantada. En lugar de usar una llamada al método suplantado y ejecutar la función en WindowsImpersonationContext, puede usar RunImpersonated(SafeAccessTokenHandle, Action) y proporcionar la función directamente como parámetro. |
RunImpersonated(SafeAccessTokenHandle, Action)
Ejecuta la acción especificada como identidad de Windows suplantada. En lugar de usar una llamada al método suplantado y ejecutar la función en WindowsImpersonationContext, puede usar RunImpersonated(SafeAccessTokenHandle, Action) y proporcionar la función directamente como parámetro.
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)
Parámetros
- safeAccessTokenHandle
- SafeAccessTokenHandle
SafeAccessTokenHandle de la identidad de Windows suplantada.
- action
- Action
System.Action que se va a ejecutar.
Ejemplos
En el ejemplo siguiente se muestra el uso de la WindowsIdentity clase para suplantar a un usuario.
Advertencia
En este ejemplo se pide al usuario que escriba una contraseña en la pantalla de la consola. La contraseña estará visible en la pantalla, ya que la ventana de la consola no admite la entrada enmascarada de forma nativa.
// 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);
}
}
Comentarios
Nota
Este método se puede usar de forma confiable con el patrón async/await, a diferencia de Impersonate
. En un método asincrónico, la sobrecarga genérica de este método se puede usar con un argumento delegado asincrónico para que se espere a la tarea resultante.
Se aplica a
RunImpersonated<T>(SafeAccessTokenHandle, Func<T>)
Ejecuta la función especificada como identidad de Windows suplantada. En lugar de usar una llamada al método suplantado y ejecutar la función en WindowsImpersonationContext, puede usar RunImpersonated(SafeAccessTokenHandle, Action) y proporcionar la función directamente como parámetro.
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
Parámetros de tipo
- T
Tipo de objeto usado y devuelto por la función.
Parámetros
- safeAccessTokenHandle
- SafeAccessTokenHandle
SafeAccessTokenHandle de la identidad de Windows suplantada.
- func
- Func<T>
System.Func que se va a ejecutar.
Devoluciones
Resultado de la función.
Ejemplos
En el ejemplo siguiente se muestra el uso de la WindowsIdentity clase para suplantar a un usuario.
Advertencia
En este ejemplo se pide al usuario que escriba una contraseña en la pantalla de la consola. La contraseña estará visible en la pantalla, ya que la ventana de la consola no admite la entrada enmascarada de forma nativa.
// 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);
}
}
Comentarios
Nota
Este método se puede usar de forma confiable con el patrón async/await, a diferencia de Impersonate
. En un método asincrónico, este método se puede usar con un argumento delegado asincrónico para que se pueda esperar a la tarea resultante.