Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Windows Server系統教程 >> Windows Server教程 >> 通過.NET Framework訪問活動目錄(2)

通過.NET Framework訪問活動目錄(2)

日期:2017/1/24 11:02:29      編輯:Windows Server教程


這裡的第一個構造器是一個基本的缺省構造器,能夠在無需任何參數的情況下創建對象。這意味著該對象將在沒有指定的安全權限的情況下連接到本機的WinNT提供者。

第二個構造器使我們能夠指定連接到給定域的AD上所需要的證書,在需要使用給定的證書連接到任意域名時,這一構造器非常方便。

第二個構造器中增添了LoginPath參數,這將使我們能夠覆蓋LoginPath,能夠選擇缺省提供商之外的其他服務提供者。

下面的代碼被我稱為“活動方法”,代碼如下所示:

public DSHelper.DSUser LoadUser(string username)

這一方法用來接收用戶名,並在當前的提供者中查找DirectoryEntry。如果沒有找到,就簡單地返回NULL。

public System.Boolean AddUserToGroup(string groupname, DSHelper.DSUser dsUser)

這一方法接收現有組的名字和定制的DSUser類的實例,並試圖將用戶添加到提供的組中。這也是第一個我們能看到impersonation的方法()。這一方法的核心是下面這行代碼:

public System.Collections.ArrayList GetGroups()

我們將使用該方法獲得域中所有組的名單。

public System.Boolean DeleteUser(DSHelper.DSUser dsUser)

這一方法獲得給定的用戶名,並從活動目錄中完全刪除它。

public System.DirectoryServices.DirectoryEntry SaveUser(DSHelper.DSUser dsUser)

沒有實際的在數據庫中保存和插入記錄的能力,就不能被稱為一個完整的DAL。上面的方法可以完成這二項任務,它首先檢查AD,看是否有指定的用戶存在。如果存在,,則會用我們提供的數據更新該用戶。如果用戶不存在,就會創建一個用戶。

public System.Boolean Connect()

最後,我們需要一個方法,與數據庫進行連接,Connect()就是用來完成這一任務的方法。需要指出的是,此時,它不執行任何假冒的操作或指定使用AD的證書,我們只在需要的時候才提供證書,這就使得在沒有提供安全證書的情況下,DAL只能在只讀的狀態下使用。

下面我們將上面的內容串起來,來看看我們如何使用DAL創建ASP.NET用戶管理頁。

ASP.NET用戶管理頁

在這一例子工程中,我們能夠為系統管理員用戶輸入用戶名和口令,它還提供了一個文本框,我們可以輸入域中任何用戶的名字,就會列出其所有屬性。我們還可以對用戶進行編輯、保存操作,也可以完全刪除該用戶。

現在我們來詳細地回顧整個工程,其中重點是與DAL進行交互的部份。請讀者考慮使用新的方法改進界面,並實際地創建一個可用性更高以及更友好的設計。另外,讀者也可以考慮如何使用控制台應用程序創建界面。

扮演

“扮演”這個詞的意思是,我們以其他人或用戶的身份執行操作。在我們的ASP.NET應用程序中,這意味著我們可以暫時地客串其他用戶,而不是IIS用來處理匿名訪問的缺省帳戶的ASP.NET用戶。我們希望能夠使自己的代碼扮演對AD資源有更大訪問權限的其他用戶,以便對資源進行適當的修改。要完成這一過程非常簡單。

#region setup impersonation via interop
//需要保存詳細資料時,為完成扮演需要通過InteropServices從COM中導入
public const int LogoN32_LogoN_INTERACTIVE = 2;
public const int LogoN32_PROVIDER_DEFAULT = 0;
System.Security.Principal.WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]public static extern int
LogonUser(String lpszUserName,
String lpszDomain,String lpszPassword,int dwLogonType,int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto,
SetLastError=true)]public
extern static int DuplicateToken(IntPtr hToken, int impersonationLevel,
ref IntPtr hNewToken);
#endregion

圖1.5 建立扮演

首先,我們需要從advapi32.dll中導入新的方法,其中包括一些有用的常量。名字為impersonationContext的變量將用來保持扮演操作之前的Windows用戶。

這樣,我們就建立了扮演,下面是一個如何使用它的例子:

if(impersonateValidUser(this.LoginUsername, this.DomainName,
this.loginPassword)) {
//在這裡插入在指定用戶的安全環境下運行的代碼
//不要忘記取消扮演
undoImpersonation();
} else {
//扮演操作失敗了,插入保證失敗後系統安全的機制
}

圖1.6 扮演的使用

我們只需要簡單地以有效的用戶名和口令調用impersonateValidUser方法,來扮演該用戶。從現在開始,只到調用undoImpersonation()之後,我們將以給定的用戶名執行所有的操作。

為了使ASP.NET下的扮演操作能夠正常地工作,我們應當改變machine.config(c:\winnt\microsoft.net\framework\v%VERSION%\config\machine.config)中的processModel節點,其中的username屬性必須被設置成System。

結束語

本篇文章所論述的是使用System.DirectoryServices名字空間完成一個能夠完全地運行的、面向任何提供商AD的DAL所必需的基本內容。在實際應用中,可以對該例子進行改變,使這更符合我們的要求。需要記住的是,對於任何能夠實際使用的DAL,它不應當只局限於包括正常的數據庫提供者在內的一種服務提供者。我們應當能夠交換DAL。

看過本篇文章後,讀者可能感到有一種意猶未盡的感覺。讀者可能希望在其中添加組管理的功能,其中包括組的創建、編輯和刪除,並顯示每個用戶所屬的組以及每個組中的用戶。不過這些都需要通過COM Interop才能完成,請讀者自行參閱有關資料。
 
Copyright © Windows教程網 All Rights Reserved