Основная группа пользователя задается атрибутом primaryGroupID
пользователя.Фактически primaryGroupID
содержит RID основной группы в строковом формате.Вот почему я сначала получаю SID группы, которую вы ищете для пользователей, затем вычисляю (плохо) RID и ищу пользователей с primaryGroupID
, содержащим RID.
/* Connection to Active Directory
*/
DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr");
/* Directory Search for agroup
*/
string givenGrpName = "MonGrpSec";
DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
dsLookFor.Filter = string.Format ("(sAMAccountName={0})", givenGrpName);
dsLookFor.SearchScope = SearchScope.Subtree;
dsLookFor.PropertiesToLoad.Add("cn");
dsLookFor.PropertiesToLoad.Add("objectSid");
SearchResult srcGrp = dsLookFor.FindOne();
/* Get the SID
*/
SecurityIdentifier secId = new SecurityIdentifier(srcGrp.Properties["objectSid"][0] as byte[], 0);
/* Find The RID (sure exists a best method)
*/
Regex regRID = new Regex(@"^S.*-(\d+)$");
Match matchRID = regRID.Match(secId.Value);
string sRID = matchRID.Groups[1].Value;
/* Directory Search for users that has a particular primary group
*/
DirectorySearcher dsLookForUsers = new DirectorySearcher(deBase);
dsLookForUsers.Filter = string.Format("(primaryGroupID={0})", sRID);
dsLookForUsers.SearchScope = SearchScope.Subtree;
dsLookForUsers.PropertiesToLoad.Add("cn");
SearchResultCollection srcUsers = dsLookForUsers.FindAll();
foreach (SearchResult user in srcUsers)
{
Console.WriteLine("{0} is the primary group of {1}", givenGrpName, user.Properties["cn"][0]);
}