共用方式為


模擬和還原

更新:2007 年 11 月

有時候,您可能需要取得 Windows NT 帳戶語彙基元 (Token) 來模擬 Windows 帳戶。例如,您的 ASP.NET 架構應用程式可能必須在不同時間代表多位使用者採取動作。您的應用程式可能會接受代表網際網路資訊服務 (IIS) 系統管理員的語彙基元,模擬那位使用者、執行作業,並還原為先前的識別。接下來,它可能接受代表較少權限的使用者的 IIS 語彙基元,執行某個作業,並且再度還原。

如果應用程式必須模擬 IIS 未將 Windows 帳戶附加到目前執行序的情況,那麼您必須擷取該帳戶的語彙基元並使用擷取的語彙基元啟動帳戶。若要進行這項工作,請執行下列動作:

  1. 呼叫 Unmanaged LogonUser 方法以擷取特定使用者的帳戶語彙基元。這個方法不在 .NET Framework 基底類別 (Base Class) 程式庫中,但在 Unmanaged 的 advapi32.dll 中可找到。在 Unmanaged 程式碼中存取方法是進階的操作,而且超出這個討論範圍。如需詳細資訊,請參閱與 Unmanaged 程式碼互通。如需 LogonUser 方法和 advapi32.dll 的詳細資訊,請參閱 Platform SDK 文件。

  2. 建立 WindowsIdentity 類別的新執行個體,傳遞語彙基元。下列程式碼示範這個呼叫,其中 hToken 代表 Windows 語彙基元。

    WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
    
    Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
    
  3. 藉著建立 WindowsImpersonationContext 類別的新執行個體,和使用已初始化類別的 WindowsIdentity.Impersonate 方法將它初始化,來開始進行模擬,如下列程式碼所示。

    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
    
    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
    
  4. 當您不再需要模擬時,呼叫 WindowsImpersonationContext.Undo 方法還原模擬,如下列程式碼所示。

    MyImpersonation.Undo();
    
    MyImpersonation.Undo()
    

如果信任程式碼已經附加 WindowsPrincipal 物件到執行緒,您可以呼叫不會取得帳戶語彙基元的 Impersonate 執行個體方法。請注意,只有在執行緒上的 WindowsPrincipal 物件代表著使用者 (而不是代表現在處理序正於其下執行的使用者) 時,這個作法才能發揮效用。例如,您可能遇到開啟 Windows 驗證而關閉模擬來使用 ASP.NET 的這個情形。這個案例中,在目前主體代表著正在存取網頁的 Windows 使用者的時候,處理序在網際網路資訊服務 (IIS) 所設定的帳戶下執行。

注意,ImpersonateUndo 都不會變更與目前呼叫內容相關聯的 Principal 物件。反之,模擬和還原會變更與目前作業系統處理序相關的語彙基元。

請參閱

概念

Principal 和 Identity 物件

ASP.NET 模擬

使用 IIS 驗證和 ASP.NET 模擬

參考

WindowsIdentity

WindowsImpersonationContext

其他資源

與 Unmanaged 程式碼互通