通过属性memberof可以获取用户的所有组,但除了主要组.
不过可以通过primaryGroupID来获取,虽然它返回的是rid
尝试用rid作为filter,但总是取不回结果来。
最后只好通过objectSid,但objectSid是个byte[]类型,所以通过filter也获取不到,最后只好通过把所有的组缓存到本地,然后来获取组名称,代码如下:
public string[] GetAllGroupsForUser(string username)
{
var searcher = new DirectorySearcher(Utility.GetDomainDirectoryEntry());
searcher.Filter = "(&(sAMAccountName=" + trueUserName.Trim() + "))";
searcher.PropertiesToLoad.Add("memberof");
searcher.PropertiesToLoad.Add("primaryGroupID");
SearchResultCollection searchCollecton = searcher.FindAll();
var groups = new List<string>();
foreach (SearchResult searchResult in searchCollecton)
{
if (searchResult.Properties["memberof"] == null)
{
return (null);
}
foreach (var memberof in searchResult.Properties["memberof"])
{
groups.Add(memberof.ToString().Substring(3, memberof.ToString().IndexOf(",") - 3));
}
if (searchResult.Properties["primaryGroupID"].Count > 0)
{
groups.Add(GetGroupNameByRid((Int32)searchResult.Properties["primaryGroupID"][0]));
}
}
return groups.ToArray();
}
public String GetGroupNameByRid(Int32 rid)
{
String result;
if (groupNames.TryGetValue(rid, out result)) return result;
else ReloadGroupNames();
return groupNames[rid];
}
private void ReloadGroupNames()
{
lock (loadGroupLock)
{
var searcher = new DirectorySearcher(Utility.GetDomainDirectoryEntry());
searcher.Filter = "(&(objectClass=group))"; //获取所有的组
searcher.PropertiesToLoad.Add("objectSid"); //获取组的objectSid
searcher.PropertiesToLoad.Add("name"); //获取组的名称
SearchResultCollection searchResults = searcher.FindAll();
foreach (SearchResult searchResult in searchResults)
{
//从sid中获取rid
SecurityIdentifier secId = new SecurityIdentifier(searchResult.Properties["objectSid"][0] as byte[], 0);
Regex regRID = new Regex(@"^S.*-(\d+){1}quot;);
Match matchRID = regRID.Match(secId.Value);
string sRID = matchRID.Groups[1].Value;
Int32 rid = Int32.Parse(sRID);
if (groupNames.ContainsKey(rid)) continue;
groupNames.Add(rid,(String)searchResult.Properties["name"][0]);
}
}
}
private static Object loadGroupLock = new object(); //锁
private static Dictionary<Int32, String> groupNames = new Dictionary<int, string>(); //保存rid和name