1

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ようなエラーがスローされます

この操作を実行するには、プリンシパルオブジェクトに有効なSIDIdentityTypeが必要です。

のプロパティを調べるとContactPrincipalSid実際にはnullです。Contactaはセキュリティのないオブジェクトであるため、これは驚くべきことではありません。

Contact非セキュリティグループにを追加するにはどうすればよいですか?

4

3 に答える 3

1

SIDだけを使用しないのはなぜですか?それ以外の場合、ユーザーとグループを一意に識別するために何を使用していますか?GUID?


  1. ContactPrinciple検索クエリが正しい結果を返していることを確認しますか?.NETFramework3.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

おそらく、グループまたは連絡先に対するあなたの価値は、期待されるdistinguishedNameではありませんか?

ただし、連絡先がセキュリティグループのメンバーになれない、またはセキュリティが有効なユーザーまたはグループオブジェクトが配布グループのメンバーにならない可能性がある理由はありません。

たぶん、最初に基本に戻りますか?

この(最小限の)コードは、ユーザーが権限を持っていることを前提として完全に機能します。そうでない場合は、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は、グループのdistinguishedNameです。

これでうまくいく場合は、必要なものを追加してください。そうでない場合。理由を理解してください。

于 2013-01-08T11:23:32.147 に答える
0

ユーザーがSIDを持っていないか、すでに取得されているSIDを使用しようとしているようです。あなたは見ましたか、そしてSIDは何ですか?また、JSuarは正しいです。ADでは常にnullをチェックすることをお勧めします(十分に強調することはできません)。ADオブジェクトはnullを返し、エラーをスローしません。nullチェックは誰にも害を与えません。

于 2013-01-08T06:17:36.990 に答える