【问题标题】:How to find users in AD that belong to a group, and just get their SAMAccountName, and SID?如何在 AD 中查找属于某个组的用户,并获取他们的 SAMAccountName 和 SID?
【发布时间】:2011-12-02 03:19:19
【问题描述】:

我只希望用户能够在文本框中输入组名,然后只返回他们的登录名和 SID。

到目前为止,我有这个,它会加载组中的用户,但我不确定如何提取登录名和 SID。

 SearchResult result;
            DirectorySearcher search = new DirectorySearcher();
            search.Filter = String.Format("(cn={0})", txtGroup.Text);
            search.PropertiesToLoad.Add("member");
            search.PropertiesToLoad.Add("cn");
            search.PropertiesToLoad.Add("objectGUID");
            result = search.FindOne();


            StringBuilder userNames = new StringBuilder();
            if (result != null)
            {
                for (int counter = 0; counter <
                result.Properties["member"].Count; counter++)
                {
                    string user = (string)result.Properties["member"][counter];
                    userNames.AppendLine(user);

                }
            }
            lblResults.Text = userNames.ToString();

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

    包含 SID 的属性称为 objectSid,对于 NT4 兼容版本,包含登录名的属性是 sAMAccountNameuserPrincipalName。你最好听从@Virkkunen 的建议。

    static void Main(string[] args)
    {
      /* Connection to Active Directory
       */
      DirectoryEntry deBase = new DirectoryEntry("LDAP://192.168.183.138:389/dc=societe,dc=fr", "administrateur", "pwd");
    
      /* Directory Search
       */
      DirectorySearcher dsLookForGrp = new DirectorySearcher(deBase);
      dsLookForGrp.Filter = String.Format("(cn={0})", "yourgroup");
      dsLookForGrp.SearchScope = SearchScope.Subtree;
      dsLookForGrp.PropertiesToLoad.Add("distinguishedName");
      SearchResult srcGrp = dsLookForGrp.FindOne();
    
      /* Directory Search
       */
      DirectorySearcher dsLookForUsers = new DirectorySearcher(deBase);
      dsLookForUsers.Filter = String.Format("(&(objectCategory=person)(memberOf={0}))", srcGrp.Properties["distinguishedName"][0]);
      dsLookForUsers.SearchScope = SearchScope.Subtree;
      dsLookForUsers.PropertiesToLoad.Add("objectSid");
      dsLookForUsers.PropertiesToLoad.Add("userPrincipalName  ");
      dsLookForUsers.PropertiesToLoad.Add("sAMAccountName");
      SearchResultCollection srcLstUsers = dsLookForUsers.FindAll();
    
      foreach (SearchResult sruser in srcLstUsers)
      {
        Console.WriteLine("{0}", sruser.Path);
    
        SecurityIdentifier sid = new SecurityIdentifier((byte[])   sruser.Properties["objectSid"][0], 0);
        Console.WriteLine(sid.ToString());    
    
        foreach (string property in sruser.Properties.PropertyNames)
        {
          Console.WriteLine("\t{0} : {1} ", property, sruser.Properties[property][0]);
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      我认为如果您反转查询会更好:

      (&(objectClass=user)(memberOf={0}))
      

      这样,您将使用FindAll 直接获取用户列表。不要忘记将sAMAccountName 等添加到PropertiesToLoad

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        相关资源
        最近更新 更多