DirectoryEntry 對象
在 System.DirectoryServices 中,目錄中的每個對象都由 DirectoryEntry 對象表示。DirectoryEntry 在記憶體中建立一個項對象;在調用 CommitChanges 方法之前,它實際上并沒有在目錄中建立該對象。這樣做的好處在于,您可以從用戶端應用程式檢索用于通路的目錄資訊,并且在本地讀取或修改這些資訊,然後重新連接配接到伺服器,以便将修改後的資訊儲存到該目錄。這會使伺服器的執行效率達到最高。
每個網絡資源都表示為目錄中的一個對象,并且每個目錄對象(如前所述)都表示為用戶端應用程式中的 DirectoryEntry。
目錄項對象具有下列特征:
- Name。此對象名稱也稱作相對可分辨名稱 (RDN)。RDN 的格式采用文法 key=value。例如,在下圖中,使用者對象的 RDN 是 CN=Jeff Smith。請注意,空格不包括在内。
- Parent。網絡對象是分層的,并且除位于層次結構頂部的根對象(它是域對象,有時稱作域頭)之外都具有父對象。
- Path。目錄對象路徑也稱作可分辨名稱 (DN)。可分辨名稱由對象名稱以及置于該名稱前面的其各級父對象直至根對象的名稱組成。例如,對于使用者對象 CN=Jeff Smith,DN 以根對象開頭,後面跟指向該使用者對象的路徑,如下所示:DC=Fabrikam,DC=COM,OU=Sales,CN=Jeff Smith。路徑使用 LDAP 規範定義的文法。有關該路徑的正确文法的詳細資訊,請參閱綁定字元串。該路徑用于由 DirectoryEntry 對象建立的綁定字元串中。
對象路徑模型
盡管前面的資訊适用于使用 System.DirectoryServices 連接配接到的任何 LDAP 目錄對象,但還有一些針對 Active Directory 域服務的事項需要予以注意。Active Directory 域服務對象的一個特性是,它們必須包含全局唯一辨別符 (GUID)。盡管可以修改該對象的不同屬性值,但 GUID 是不可變的。
下面的代碼示例說明如何建立 DirectoryEntry 并編寫其路徑、名稱和 GUID。在此示例中,DirectoryEntry 綁定到此使用者目前連接配接到的域的根。
static void Main()
{
DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
DirectoryEntry NewUser = AD.Children.Add("222", "user");
NewUser.Invoke("SetPassword", new object[] { "#12345Abc" });
// NewUser.Invoke("Put", new object[] { "Description", "Test User from .NET" });
NewUser.CommitChanges();
DirectoryEntry grp;
//grp = AD.Children.Find("Guests", "group");
//if (grp != null)
//{
// grp.Invoke("Add", new object[] { NewUser.Path.ToString() });
//}
Console.WriteLine("Account Created Successfully");
Console.WriteLine("Path:---" + AD.Path);
Console.WriteLine("Name:---" + AD.Name);
Console.WriteLine("Guid:---" + AD.Guid);
Console.WriteLine("AuthenticationType:---" + AD.AuthenticationType);
Console.WriteLine("Children-:---" + AD.Children);
Console.WriteLine("Container:---" + AD.Container);
Console.WriteLine("NativeGuid:---" + AD.NativeGuid);
Console.WriteLine("NativeObject:---" + AD.NativeObject);
// Console.WriteLine("ObjectSecurity:---" + AD.ObjectSecurity);
Console.WriteLine("Options:---" + AD.Options);
Console.WriteLine("Parent:---" + AD.Parent);
Console.WriteLine("Properties:---" + AD.Properties);
Console.ReadLine();
Console.ReadKey();
}
外加套餐:
System.DirectoryServices 命名空間用以從托管代碼簡便地通路 Active Directory。
該命名空間包含兩個元件類,即 DirectoryEntry 和 DirectorySearcher,
它們使用 Active Directory 服務接口 (ADSI) 技術。ADSI 是 Microsoft 提供的一組接口,作為使用各種網絡提供程式的靈活的工具。無論網絡有多大,
ADSI 都可以使管理者能夠相對容易地定位和管理網絡上的資源。
System.DirectoryServices 命名空間中的類可以與任何 Active Directory 服務提供程式一起使用。目前的一些提供程式包括 Internet 資訊服務 (IIS)、輕量目錄通路協定 (LDAP)、Novell NetWare 目錄服務 (NDS) 和 WinNT。
ADSI 是 Microsoft Active Directory 的程式設計接口,使應用程式能夠隻使用一個接口就可以與網絡上的不同目錄進行互動。使用 ADSI,可以建立一些應用程式,
用以執行常見任務,如備份資料庫、通路列印機和管理使用者帳戶。
Path 屬性
Path 屬性唯一地辨別網絡環境中的此項。始終可以使用此 Path 檢索此項。
設定 Path 将從目錄存儲區檢索新項;它不更改目前綁定的項的路徑。
與 DirectoryEntry 元件關聯的類可與任何 Active Directory 域服務提供程式一起使用。目前的一些提供程式包括 Internet 資訊服務 (IIS)、輕量目錄通路協定 (LDAP)、Novell NetWare 目錄服務 (NDS) 和 WinNT。
說明:辨別提供程式(在“://”前面)的 Path 部分是區分大小寫的。例如,“LDAP://”或“WinNT://”。
Path 屬性的文法随提供程式不同而不同。一些常見的情況有:
名稱 | 作用 |
---|---|
WinNT | 連接配接到計算機上的組。例如“WinNT://<域名>/<計算機名>/<組名>”。如果是連接配接到本地計算機,則為“WinNT://<計算機名>/<組名>”。 發現網絡上的所有域。例如,“WinNT:”通過枚舉此項的子級可以找到這些域。 |
LDAP | 連接配接到域中的組。例如“LDAP://CN=<組名>, CN =<使用者>, DC=<域元件>, DC=<域元件>,…”。 |
IIS | 連接配接到 Web 目錄。例如“IIS://LocalHost/W3SVC/1/ROOT/”。若要使用 LDAP 綁定到目前域,請使用路徑“LDAP://RootDSE”,然後擷取預設命名上下文,并重新綁定該項。例如:String str = ent.Properties[“defaultNamingContext”][0]; DirectoryEntry domain = new DirectoryEntry(“LDAP://” + str); |
-
在網頁中的通用方法:
擷取伺服器電腦名:Page.Server.MachineName
擷取使用者資訊:Page.User
擷取用戶端電腦名:Page.Request.UserHostName
擷取用戶端電腦IP:Page.Request.UserHostAddress
-
在網絡程式設計中的通用方法:
擷取目前電腦名:static System.Net.Dns.GetHostName()
根據電腦名取出全部IP位址:static System.Net.Dns.Resolve(電腦名).AdressList
也可根據IP位址取出電腦名:static System.Net.Dns.Resolve(IP位址).HostName
-
系統環境類的通用屬性:
目前電腦名:static System.Environment.MachineName
目前電腦所屬網域:static System.Environment.UserDomainName
目前電腦使用者:static System.Environment.UserName
建立示例
打開 Microsoft Visual Studio .NET,然後建立一個 Visual C# Console 應用程式項目。
在“解決方案資料總管”中,右鍵單擊引用,然後單擊添加引用。
添加一個對 System.DirectoryServices.dll 程式集的引用。
static void Main()
{
DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
DirectoryEntry NewUser = AD.Children.Add("222", "user");
NewUser.Invoke("SetPassword", new object[] { "#12345Abc" });
NewUser.Invoke("Put", new object[] { "Description", "Test User from .NET" });
NewUser.CommitChanges();
DirectoryEntry grp;
grp = AD.Children.Find("Guests", "group");
if (grp != null)
{
grp.Invoke("Add", new object[] { NewUser.Path.ToString() });
}
Console.ReadKey();
}
建立本示例中的目錄項時,假定系統正在運作 Microsoft Windows NT、Windows 2000 或 Windows XP。 注意,向 DirectoryEntry 構造函數傳遞以“WinNT://”開頭的字元串。 您還可以在其他第三方作業系統上運作“目錄服務”。
DirectoryEntry AD = new DirectoryEntry("WinNT://" + SystemInformation.ComputerName + ",computer");
向目錄樹添加目錄項
以下代碼在 Active Directory 樹中添加了一個 user 類型的、值為 TestUser1 的 DirectoryEntry。
設定新使用者帳戶的密碼和說明
以下代碼調用 Invoke 方法來調用 DirectoryEntry 對象的 SetPassword 和 Put 方法。 這将為使用者帳戶設定密碼并配置設定說明。 此代碼還調用 CommitChanges 方法儲存這些更改。
NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
NewUser.CommitChanges();
将帳戶添加到組
将帳戶添加到組的第一步是定義 DirectoryEntry 類型的變量。 然後調用 ActiveDirectory 類 Children 成員的 Find 方法來填充變量。 在這種情況下,Guest 組是搜尋目标。 此代碼測試 Find 方法傳回的值以确定是否已找到該組。 如果找到該組,新使用者帳戶便會添加到組中。
DirectoryEntry grp;
grp = AD.Children.Find("Guests", "group");
if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}
http://www.cnblogs.com/tinawan/archive////html