1

我正在尝试将 a 添加Contact到分发列表中。

这是我的做法:

public void AddContactsToGroup(string groupName, string[] userNames)
{
         using (PrincipalContext context = GetPrincipalContext())
         {
            var group = GroupPrincipal.FindByIdentity(context, IdentityType.Name, groupName);

            if (group.IsSecurityGroup.HasValue && group.IsSecurityGroup.Value == true)
               throw new ArgumentException("Groups cannot be security groups.");

            foreach (var userName in userNames)
            {
               var query = new ContactPrincipal(context)
                              {
                                 Name = userName
                              };

               var user = Search(query).First();

               group.Members.Add(user);
            }

            group.Save(context);
         }
      }

  private List<T> Search<T>(T query) where T : Principal
  {
     var searcher = new PrincipalSearcher();
     searcher.QueryFilter = query;
     PrincipalSearchResult<Principal> results = searcher.FindAll();

     return results.Cast<T>().ToList();
  }

这是ContactPrincipal课程(我从某个地方借来的):

   [DirectoryObjectClass("contact")]
   [DirectoryRdnPrefix("CN")]
   public class ContactPrincipal : AuthenticablePrincipal
   {
      public ContactPrincipal(PrincipalContext context)
         : base(context)
      {
      }

      public static ContactPrincipal FindByIdentity(PrincipalContext context, string identityValue)
      {
         return (ContactPrincipal) Principal.FindByIdentityWithType(context, typeof (ContactPrincipal), identityValue);
      }

      public static ContactPrincipal FindByIdentity(PrincipalContext context, IdentityType identityType,
                                                    string identityValue)
      {
         return
            (ContactPrincipal)
            Principal.FindByIdentityWithType(context, typeof (ContactPrincipal), identityType, identityValue);
      }

      [DirectoryProperty("mail")]
      public string EmailAddress
      {
         get
         {
            if (ExtensionGet("mail").Length == 1)
            {
               return ExtensionGet("mail")[0].ToString();
            }
            else
            {
               return null;
            }
         }
         set { ExtensionSet("mail", value); }
      }

      [DirectoryProperty("givenName")]
      public string GivenName
      {
         get
         {
            if (ExtensionGet("givenName").Length == 1)
            {
               return ExtensionGet("givenName")[0].ToString();
            }
            else
            {
               return null;
            }
         }
         set { ExtensionSet("givenName", value); }
      }

      [DirectoryProperty("middleName")]
      public string MiddleName
      {
         get
         {
            if (ExtensionGet("middleName").Length == 1)
            {
               return ExtensionGet("middleName")[0].ToString();
            }
            else
            {
               return null;
            }
         }
         set { ExtensionSet("middleName", value); }
      }

      [DirectoryProperty("sn")]
      public string Surname
      {
         get
         {
            if (ExtensionGet("sn").Length == 1)
            {
               return ExtensionGet("sn")[0].ToString();
            }
            else
            {
               return null;
            }
         }
         set { ExtensionSet("sn", value); }
      }

      [DirectoryProperty("mobile")]
      public string MobileTelephoneNumber
      {
         get
         {
            if (ExtensionGet("mobile").Length == 1)
            {
               return ExtensionGet("mobile")[0].ToString();
            }
            else
            {
               return null;
            }
         }
         set { ExtensionSet("mobile", value); }
      }

      [DirectoryProperty("telephoneNumber")]
      public string VoiceTelephoneNumber
      {
         get
         {
            if (ExtensionGet("telephoneNumber").Length == 1)
            {
               return ExtensionGet("telephoneNumber")[0].ToString();
            }
            else
            {
               return null;
            }
         }
         set { ExtensionSet("telephoneNumber", value); }
      }
   }

我的问题是,当我点击

group.Members.Add(user) 

方法中的行AddContactsToGroup,抛出一个错误,指出

Principal 对象必须具有有效的 SID IdentityType 才能执行此操作。

当我询问 的属性时ContactPrincipalSid实际上是 null。这并不奇怪,因为 aContact是一个没有安全性的对象。

如何添加Contact到非安全组?

4

3 回答 3

1

为什么不只使用 SID?否则,您使用什么来唯一标识您的用户和组?图形用户界面?


  1. 您确定ContactPrinciple搜索查询返回正确的结果吗?在 .NET Framework 3.5 中管理目录安全主体中寻找自己的部分可能会有所帮助。为什么不使用ContactPrincipal FindByIdentity而不是搜索查询来搜索每个用户?

  2. 同样,也许您应该添加一行来检查用户原则是否等于,null然后再尝试将其添加到组中。

    if(user != null) { group.Members.Add(user); }

  3. 此外,该底部的线程似乎描述了您遇到的相同问题。这是VB中提供的解决方案。

    如何将联系人添加到组:)?由于某种原因,通过将用户或组添加到组的常规方法将联系人添加到组会导致错误。为了解决这个问题,我使用了以下代码:

    Public Sub AddPrincipalToGroup(ByVal Group As GroupPrincipal, ByVal ChildPrincipal As Principal)
        ' use the underlying DirectoryEntry objects to avoid 
        ' issues surrounding contacts and other custom types
        Dim deGroup As DirectoryEntry = Group.GetUnderlyingObject()
    
        deGroup.Properties("member").Add(ChildPrincipal.DistinguishedName)
        deGroup.CommitChanges()
    End Sub
    

其他可能有用的链接:

于 2013-01-08T04:29:15.810 回答
1

可能您对组或联系人的值不是预期的 distinctName?

但是,没有理由不能让联系人成为安全组的成员,或者启用安全性的用户或组对象可能不是通讯组的成员。

也许先回到基础?

假设用户具有权限,此(简约)代码可以完美运行。如果没有,请在 directoryEntries 中使用正确的用户名和密码。

public static void AddContactToGroup(string ContactDN, string GroupDN)
{
  try
  {
    using (DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + GroupDN))
    {
      directoryEntry.RefreshCache();
      DirectoryEntry Contactgroup = new DirectoryEntry("LDAP://" + ContactDN);
      directoryEntry.Properties["member"].Add(Contactgroup.Properties["distinguishedName"].Value);
      directoryEntry.CommitChanges();
    }
  }
  catch (Exception e)
  {
    string msg = e.Message.ToString();
    throw e;
  }
}

ContactDN 是联系人的专有名称。GroupDN 是组的专有名称。

如果这对您有用,请添加您需要的内容。如果不。找出原因。

于 2013-01-08T11:23:32.147 回答
0

听起来您的用户要么没有 SID,要么正在尝试使用已被占用的 SID。你看过SID是什么吗?JSuar 也是正确的,对于 AD,检查 null 始终是一个好主意(我不能强调这一点),AD 对象可以返回 null 而不会抛出任何错误,null 检查永远不会伤害任何人。

于 2013-01-08T06:17:36.990 回答