WindowsIdentity.RunImpersonated 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
오버로드
RunImpersonated(SafeAccessTokenHandle, Action) |
가장된 Windows ID로 지정된 작업을 실행합니다. 가장된 메서드 호출을 사용하여 WindowsImpersonationContext에서 함수를 실행하지 않고 RunImpersonated(SafeAccessTokenHandle, Action)를 사용하여 매개 변수로 직접 함수를 제공할 수 있습니다. |
RunImpersonated<T>(SafeAccessTokenHandle, Func<T>) |
가장된 Windows ID로 지정된 함수를 실행합니다. 가장된 메서드 호출을 사용하여 WindowsImpersonationContext에서 함수를 실행하지 않고 RunImpersonated(SafeAccessTokenHandle, Action)를 사용하여 매개 변수로 직접 함수를 제공할 수 있습니다. |
RunImpersonated(SafeAccessTokenHandle, Action)
가장된 Windows ID로 지정된 작업을 실행합니다. 가장된 메서드 호출을 사용하여 WindowsImpersonationContext에서 함수를 실행하지 않고 RunImpersonated(SafeAccessTokenHandle, Action)를 사용하여 매개 변수로 직접 함수를 제공할 수 있습니다.
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)
매개 변수
- safeAccessTokenHandle
- SafeAccessTokenHandle
가장 Windows ID의 SafeAccessTokenHandle입니다.
- action
- Action
실행할 System.Action입니다.
예제
다음 예제에서는 클래스를 사용하여 WindowsIdentity 사용자를 가장하는 방법을 보여 줍니다.
경고
이 샘플에서는 사용자에게 콘솔 화면에 암호를 입력하도록 요청합니다. 콘솔 창이 기본적으로 마스킹된 입력을 지원하지 않으므로 암호가 화면에 표시됩니다.
// 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);
}
}
설명
참고
이 메서드는 와 달리 Impersonate
비동기/대기 패턴으로 안정적으로 사용될 수 있습니다. 비동기 메서드에서 이 메서드의 제네릭 오버로드는 비동기 대리자 인수와 함께 사용할 수 있으므로 결과 작업이 대기될 수 있습니다.
적용 대상
RunImpersonated<T>(SafeAccessTokenHandle, Func<T>)
가장된 Windows ID로 지정된 함수를 실행합니다. 가장된 메서드 호출을 사용하여 WindowsImpersonationContext에서 함수를 실행하지 않고 RunImpersonated(SafeAccessTokenHandle, Action)를 사용하여 매개 변수로 직접 함수를 제공할 수 있습니다.
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
형식 매개 변수
- T
함수에서 사용되고 반환되는 개체의 형식입니다.
매개 변수
- safeAccessTokenHandle
- SafeAccessTokenHandle
가장 Windows ID의 SafeAccessTokenHandle입니다.
- func
- Func<T>
실행할 System.Func입니다.
반환
함수의 결과입니다.
예제
다음 예제에서는 클래스를 사용하여 WindowsIdentity 사용자를 가장하는 방법을 보여 줍니다.
경고
이 샘플에서는 사용자에게 콘솔 화면에 암호를 입력하도록 요청합니다. 콘솔 창이 기본적으로 마스킹된 입력을 지원하지 않으므로 암호가 화면에 표시됩니다.
// 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);
}
}
설명
참고
이 메서드는 와 달리 Impersonate
비동기/대기 패턴으로 안정적으로 사용될 수 있습니다. 비동기 메서드에서 이 메서드를 비동기 대리자 인수와 함께 사용하면 결과 작업이 대기될 수 있습니다.
적용 대상
.NET