WindowsIdentity.RunImpersonated Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Overload
RunImpersonated(SafeAccessTokenHandle, Action) |
Menjalankan tindakan yang ditentukan sebagai identitas Windows yang ditiru. Alih-alih menggunakan panggilan metode yang ditiru dan menjalankan fungsi Anda di WindowsImpersonationContext, Anda dapat menggunakan RunImpersonated(SafeAccessTokenHandle, Action) dan menyediakan fungsi Anda secara langsung sebagai parameter. |
RunImpersonated<T>(SafeAccessTokenHandle, Func<T>) |
Menjalankan fungsi yang ditentukan sebagai identitas Windows yang ditiru. Alih-alih menggunakan panggilan metode yang ditiru dan menjalankan fungsi Anda di WindowsImpersonationContext, Anda dapat menggunakan RunImpersonated(SafeAccessTokenHandle, Action) dan menyediakan fungsi Anda secara langsung sebagai parameter. |
RunImpersonated(SafeAccessTokenHandle, Action)
Menjalankan tindakan yang ditentukan sebagai identitas Windows yang ditiru. Alih-alih menggunakan panggilan metode yang ditiru dan menjalankan fungsi Anda di WindowsImpersonationContext, Anda dapat menggunakan RunImpersonated(SafeAccessTokenHandle, Action) dan menyediakan fungsi Anda secara langsung sebagai parameter.
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)
Parameter
- safeAccessTokenHandle
- SafeAccessTokenHandle
SafeAccessTokenHandle dari identitas Windows yang ditiru.
- action
- Action
System.Action yang akan dijalankan.
Contoh
Contoh berikut menunjukkan penggunaan WindowsIdentity kelas untuk meniru pengguna.
Peringatan
Sampel ini meminta pengguna untuk memasukkan kata sandi di layar konsol. Kata sandi akan terlihat di layar, karena jendela konsol tidak mendukung input bertopeng secara asli.
// 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);
}
}
Keterangan
Catatan
Metode ini dapat digunakan dengan andal dengan pola asinkron/menunggu, tidak seperti Impersonate
. Dalam metode asinkron, kelebihan umum metode ini dapat digunakan dengan argumen delegasi asinkron sehingga tugas yang dihasilkan dapat ditunggu.
Berlaku untuk
RunImpersonated<T>(SafeAccessTokenHandle, Func<T>)
Menjalankan fungsi yang ditentukan sebagai identitas Windows yang ditiru. Alih-alih menggunakan panggilan metode yang ditiru dan menjalankan fungsi Anda di WindowsImpersonationContext, Anda dapat menggunakan RunImpersonated(SafeAccessTokenHandle, Action) dan menyediakan fungsi Anda secara langsung sebagai parameter.
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
Jenis parameter
- T
Jenis objek yang digunakan oleh dan dikembalikan oleh fungsi .
Parameter
- safeAccessTokenHandle
- SafeAccessTokenHandle
SafeAccessTokenHandle dari identitas Windows yang ditiru.
- func
- Func<T>
System.Func untuk dijalankan.
Mengembalikan
Hasil fungsi.
Contoh
Contoh berikut menunjukkan penggunaan WindowsIdentity kelas untuk meniru pengguna.
Peringatan
Sampel ini meminta pengguna untuk memasukkan kata sandi di layar konsol. Kata sandi akan terlihat di layar, karena jendela konsol tidak mendukung input bertopeng secara asli.
// 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);
}
}
Keterangan
Catatan
Metode ini dapat digunakan dengan andal dengan pola asinkron/menunggu, tidak seperti Impersonate
. Dalam metode asinkron, metode ini dapat digunakan dengan argumen delegasi asinkron sehingga tugas yang dihasilkan dapat ditunggu.