模擬和還原
有時候,您可能需要取得 Windows NT 帳戶語彙基元 (Token) 來模擬 Windows 帳戶。 例如,您的 ASP.NET 架構應用程式可能必須在不同時間代表多位使用者採取動作。 您的應用程式可能會接受代表網際網路資訊服務 (IIS) 系統管理員的語彙基元,模擬那位使用者、執行作業,並還原為先前的識別。 接下來,它可能接受代表較少權限的使用者的 IIS 語彙基元,執行某個作業,並且再度還原。
如果應用程式必須模擬 IIS 未將 Windows 帳戶附加到目前執行序的情況,那麼您必須擷取該帳戶的語彙基元並使用擷取的語彙基元啟動帳戶。 若要進行這項工作,請執行下列動作:
呼叫 Unmanaged LogonUser 方法以擷取特定使用者的帳戶語彙基元。 這個方法不在 .NET Framework 基底類別 (Base Class) 程式庫中,但在 Unmanaged 的 advapi32.dll 中可找到。 在 Unmanaged 程式碼中存取方法是進階的操作,而且超出這個討論範圍。 如需詳細資訊,請參閱與 Unmanaged 程式碼互通。 如需 LogonUser 方法和 advapi32.dll 的詳細資訊,請參閱 Platform SDK 文件。
建立 WindowsIdentity 類別的新執行個體,傳遞語彙基元。 下列程式碼示範這個呼叫,其中 hToken 代表 Windows 語彙基元。
WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
藉著建立 WindowsImpersonationContext 類別的新執行個體,和使用已初始化類別的 WindowsIdentity.Impersonate 方法將它初始化,來開始進行模擬,如下列程式碼所示。
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
當您不再需要模擬時,呼叫 WindowsImpersonationContext.Undo 方法還原模擬,如下列程式碼所示。
MyImpersonation.Undo();
MyImpersonation.Undo()
如果信任程式碼已經附加 WindowsPrincipal 物件到執行緒,您可以呼叫不會取得帳戶語彙基元的 Impersonate 執行個體方法。 請注意,只有在執行緒上的 WindowsPrincipal 物件代表著使用者 (而不是代表現在處理序正於其下執行的使用者) 時,這個作法才能發揮效用。 例如,您可能遇到開啟 Windows 驗證而關閉模擬來使用 ASP.NET 的這個情形。 這個案例中,在目前主體代表著正在存取網頁的 Windows 使用者的時候,處理序在網際網路資訊服務 (IIS) 所設定的帳戶下執行。
注意,Impersonate 和 Undo 都不會變更與目前呼叫內容相關聯的 Principal 物件。 反之,模擬和還原會變更與目前作業系統處理序相關的語彙基元。