Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取/更新';联系人';在Active Directory中?_C#_.net_Active Directory - Fatal编程技术网

C# 如何获取/更新';联系人';在Active Directory中?

C# 如何获取/更新';联系人';在Active Directory中?,c#,.net,active-directory,C#,.net,Active Directory,有没有办法在Active Directory中查找和更新联系人?我正在构建一个示例C#.NET应用程序来完成此任务。我希望您能提供任何代码。我想您的意思是更新Active Directory中用户对象的属性。是的,这是可能的 在.NET3.5中,我们得到了System.DirectoryServices.AccountManagement名称空间,与以前的System.DirectoryServices名称空间相比,它使处理AD变得更加简单 通常,要修改用户的属性(如果您有保存权限),可以执行以

有没有办法在Active Directory中查找和更新联系人?我正在构建一个示例C#.NET应用程序来完成此任务。我希望您能提供任何代码。

我想您的意思是更新Active Directory中用户对象的属性。是的,这是可能的


在.NET3.5中,我们得到了
System.DirectoryServices.AccountManagement
名称空间,与以前的
System.DirectoryServices
名称空间相比,它使处理AD变得更加简单

通常,要修改用户的属性(如果您有保存权限),可以执行以下操作:

string sUserName = "someusertoload";
string sDomain = "test.local";
string sDefaultOU = "OU=test,DC=test,DC=local";
string sServiceUser = "userwithrights";
string sServicePassword = "somepassword";
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sDefaultOU,ContextOptions.SimpleBind, sServiceUser, sServicePassword);
UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
oUserPrincipal.GivenName = "new givenname";
oUserPrincipal.Save();
您可以找到一些帮助器方法

.NET2.0的代码示例,用于检索用户名为“john”的用户并更新该用户的街道地址。如果运行应用程序的用户没有编辑内容的权限,您可能必须将凭据添加到第一行

DirectoryEntry root = new DirectoryEntry("LDAP://server/DC=test,DC=local");
DirectorySearcher searcher = new DirectorySearcher( root, "(&(objectCategory=person)(objectClass=user)(sAMAccountName=john))" );
SearchResult result = searcher.FindOne();
DirectoryEntry user = result.GetDirectoryEntry();
user.Properties["streetAddress"][0] = "My Street 12";
user.CommitChanges();

当然,您可以在System.DirectoryServices中执行此操作

我认为你真正需要的是学会如何使用。如果你还没有一本好书,我推荐你

其实没那么难。你只需要掌握两门课,然后。表示LDAP服务器上的LDAP对象。假设您有足够的权限,您可以使用对任何LDAP对象(包括联系人对象)进行更改。每个LDAP对象都有许多属性。您需要知道的两个重要属性是
objectCategory
objectClass
。对于联系人对象,
objectCategory
应该是
person
objectClass
应该是
contact
。您可能还希望检查联系人对象上的“targetAddress”属性,该属性存储电子邮件地址。联系人对象上有一组Exchange扩展属性。你可能喜欢逐个检查它们。要浏览LDAP服务器上的对象,可以使用或之类的工具

要进行搜索,您需要提供四件事

  • 搜索根
  • LDAP搜索筛选器
  • 搜索范围
  • 返回属性
  • 如果您的计算机已加入域,并且您以域用户身份登录,下面是一个如何列出域中所有联系人的示例

    DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
    string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string;
    DirectoryEntry searchRoot = new DirectoryEntry("LDAP://" + domainContext);
    using (DirectorySearcher searcher = new DirectorySearcher(
        searchRoot, 
        "(&(objectCategory=person)(objectClass=contact))", 
        new string[] {"targetAddress"}, 
        SearchScope.Subtree))
    {
        foreach (SearchResult result in searcher.FindAll())
        {
            foreach (string addr in result.Properties["targetAddress"])
            {        
               Console.WriteLine(addr);
            }
            Console.WriteLine(result.Path);
        }
    }
    
    前三行帮助您找到域根目录的正确LDAP路径。只有当您以域用户身份登录时,它才起作用。如果知道域的正确LDAP路径,可以直接将其输入DirectoryEntry

    我将所有四个参数都输入到。当您熟悉目录服务编程时,可以跳过其中一些,而.NET将为您提供一个默认值

    从返回的结果为。请注意,即使
    targetAddress
    不是多值属性,也要始终向您返回对象集合。这是因为LDAP对象上的某些属性可能是多值的

    您可以从中获得的另一个重要信息是
    路径
    。以后可以使用此路径创建对象。要更新联系人对象,需要使用其
    Properties
    方法和
    CommitChanges
    方法

    DirectoryEntry de = new DirectoryEntry(result.Path);
    de.Properties["targetAddress"].Value = "SMTP:jane.doe@foo.bar";
    de.CommitChanges();
    

    最后,你可以很容易地找到很多关于和的在线教程。试试谷歌吧。

    你说的“联系人”是什么意思??什么“联系人”??AD存储用户和计算机帐户、安全性和通讯组等—但“联系人”是AD的一个新术语—从未听说过它……联系人就像普通的广告对象,如用户、计算机,它们在Exchange Server中显示为邮件联系人。在大多数情况下,他们有一个外部电子邮件地址又名smtp地址。嗨,米凯尔,非常感谢您的回复。我仍在处理一个仍在.NET2.0上的项目。我真的希望我能找到一种使用System.DirectoryServices的方法。谢谢你的答复。如果您有东西要与System.DirectoryService共享,请随意共享。作为一种礼貌,我接受它作为一个答案:)添加了一个样本,供您观看:)海报是指联系人。据我所知,System.DirectoryServices.AccountManagement无法与contacts一起工作System.DirectoryServices.AccountManagement可以获取和更新联系人(我已验证)。但是它不能创建联系人,只能创建用户。它也不能在一个LDAP请求中基于对象GUID选择多个用户/联系人。@Ititwebdav我真的很想获得AccountManagement通讯组成员的联系人。如果这是你已经验证过的,你能给出一个提示或参考它是如何完成的吗。我没有找到任何关于这一能力的参考资料。非常感谢您的详细回复。问题仍然是如何向联系人的对象添加多个电子邮件地址。