WindowsIdentity.RunImpersonated Yöntem

Tanım

Aşırı Yüklemeler

RunImpersonated(SafeAccessTokenHandle, Action)

belirtilen eylemi kimliğe bürünme Windows kimliği olarak çalıştırır. Kimliğe bürünülmüş bir yöntem çağrısı kullanmak ve ' de işlevinizi çalıştırmak yerine WindowsImpersonationContext RunImpersonated(SafeAccessTokenHandle, Action) işlevinizi kullanarak doğrudan bir parametre olarak sağlayabilirsiniz.

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

belirtilen işlevi kimliğe bürünme Windows kimliği olarak çalıştırır. Kimliğe bürünülmüş bir yöntem çağrısı kullanmak ve ' de işlevinizi çalıştırmak yerine WindowsImpersonationContext RunImpersonated(SafeAccessTokenHandle, Action) işlevinizi kullanarak doğrudan bir parametre olarak sağlayabilirsiniz.

RunImpersonated(SafeAccessTokenHandle, Action)

belirtilen eylemi kimliğe bürünme Windows kimliği olarak çalıştırır. Kimliğe bürünülmüş bir yöntem çağrısı kullanmak ve ' de işlevinizi çalıştırmak yerine WindowsImpersonationContext RunImpersonated(SafeAccessTokenHandle, Action) işlevinizi kullanarak doğrudan bir parametre olarak sağlayabilirsiniz.

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)

Parametreler

safeAccessTokenHandle
SafeAccessTokenHandle

kimliğe bürünülmüş Windows kimliğin safeaccesstokenhandle 'ı.

action
Action

Çalıştırılacak System. Action.

Örnekler

Aşağıdaki örnek, WindowsIdentity bir kullanıcının kimliğine bürünmek için sınıfının kullanımını gösterir.

Uyarı

Bu örnek, kullanıcıdan konsol ekranında bir parola girmesini ister. Konsol penceresi maskelenmiş girişi yerel olarak desteklemediğinden, parola ekranda görünür olur.

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

Açıklamalar

Not

Bu yöntem, öğesinden farklı olarak Async/Await düzeniyle güvenilir bir şekilde kullanılabilir Impersonate . Zaman uyumsuz bir yöntemde, bu yöntemin genel aşırı yüklemesi zaman uyumsuz bir temsilci bağımsız değişkeniyle birlikte kullanılabilir ve sonuçta elde edilen görevin beklenmiş olması gerekir.

Şunlara uygulanır

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

belirtilen işlevi kimliğe bürünme Windows kimliği olarak çalıştırır. Kimliğe bürünülmüş bir yöntem çağrısı kullanmak ve ' de işlevinizi çalıştırmak yerine WindowsImpersonationContext RunImpersonated(SafeAccessTokenHandle, Action) işlevinizi kullanarak doğrudan bir parametre olarak sağlayabilirsiniz.

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ür Parametreleri

T

Tarafından kullanılan ve işlev tarafından döndürülen nesne türü.

Parametreler

safeAccessTokenHandle
SafeAccessTokenHandle

kimliğe bürünülmüş Windows kimliğin safeaccesstokenhandle 'ı.

func
Func<T>

Çalıştırılacak System. Func.

Döndürülenler

T

İşlevin sonucu.

Örnekler

Aşağıdaki örnek, WindowsIdentity bir kullanıcının kimliğine bürünmek için sınıfının kullanımını gösterir.

Uyarı

Bu örnek, kullanıcıdan konsol ekranında bir parola girmesini ister. Konsol penceresi maskelenmiş girişi yerel olarak desteklemediğinden, parola ekranda görünür olur.

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

Açıklamalar

Not

Bu yöntem, öğesinden farklı olarak Async/Await düzeniyle güvenilir bir şekilde kullanılabilir Impersonate . Zaman uyumsuz bir yöntemde, sonuçta elde edilen görevin beklenmemesi için bu yöntem bir zaman uyumsuz temsilci bağımsız değişkeniyle birlikte kullanılabilir.

Şunlara uygulanır