有時候您可能需要取得 Windows 帳戶令牌來模擬 Windows 帳戶。 例如,您的 ASP.NET 為基礎的應用程式可能需要在不同時間代表多個使用者採取行動。 您的應用程式可能會接受代表 Internet Information Services (IIS) 系統管理員的令牌、模擬該使用者、執行作業,以及還原為先前的身分識別。 接下來,它可能會接受來自 IIS 的令牌,代表許可權較少的使用者、執行某些作業,然後再次還原。
如果您的應用程式必須模擬尚未由 IIS 附加至目前線程的 Windows 帳戶,您必須擷取該帳戶的令牌,並使用它來啟動帳戶。 您可以執行下列工作來執行此動作:
透過呼叫 Unmanaged LogonUser 方法,擷取特定使用者的帳戶令牌。 這個方法不在 .NET 基類連結庫中,而是位於 unmanaged advapi32.dll。 在 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 物件代表目前執行進程的使用者以外的使用者時,這個方法才有用。 例如,使用 ASP.NET 時,如果開啟了 Windows 驗證並關閉了模擬,您可能會遇到這種情況。 在此情況下,進程是在 Internet Information Services (IIS) 中設定的帳戶下執行,而目前的主體則代表正在存取頁面的 Windows 使用者。
請注意, 模擬 和 復原 都不會變更與目前呼叫內容相關聯的 Principal 物件 (IPrincipal)。 相反地,模擬和還原會變更與目前作系統進程相關聯的令牌。