共用方式為


模擬和還原

有時候,您可能需要取得 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 物件。 反之,模擬和還原會變更與目前作業系統處理序相關的語彙基元。

請參閱

參考

WindowsIdentity

WindowsImpersonationContext

概念

Principal 和 Identity 物件

ASP.NET 模擬

使用 IIS 驗證和 ASP.NET 模擬

其他資源

與 Unmanaged 程式碼互通