PowerShell иногда использует «отображаемые имена» для атрибутов, где фактическое имя атрибутов в AD немного отличается.PowerShell также имеет некоторые дополнительные свойства, которые переводят некоторые данные в AD во что-то полезное.Это пример этого.
Свойство PrimaryGroup
возвращает различающееся имя основной группы.Тем не менее, нет атрибута в AD, который хранит это.Основная группа определяется из атрибута primaryGroupId
, который представляет собой RID (относительный идентификатор) группы.
Таким образом, вам нужно запросить атрибут primaryGroupId
и перевести его, чтобы найти фактическую группу.Я написал статью о Нахождении всех групп пользователей , где я поделился методом, который сделает это.Это принимает DirectoryEntry
, но на самом деле ему просто нужно знать primaryGroupId
и objectSid
(поскольку он использует SID пользователя для построения SID группы):
private static string GetUserPrimaryGroup(DirectoryEntry de) {
de.RefreshCache(new[] {"primaryGroupID", "objectSid"});
//Get the user's SID as a string
var sid = new SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0).ToString();
//Replace the RID portion of the user's SID with the primaryGroupId
//so we're left with the group's SID
sid = sid.Remove(sid.LastIndexOf("-", StringComparison.Ordinal) + 1);
sid = sid + de.Properties["primaryGroupId"].Value;
//Find the group by its SID
var group = new DirectoryEntry($"LDAP://<SID={sid}>");
group.RefreshCache(new [] {"cn"});
return group.Properties["cn"].Value as string;
}
Вы должныбыть в состоянии приспособить это к извлечению значений из DirectorySearcher
.
В качестве примечания: если вы не прикоснетесь к коллекции PropertiesToLoad
, он вернет каждый атрибут со значением (исключая созданные атрибуты)).Тем не менее, рекомендуется использовать PropertiesToLoad
, если вам не нужно на законных основаниях видеть каждый атрибут.