Active Directory: как определить, является ли учетная запись служебной учетной записью?

Вопрос: Можно ли определить, является ли учетная запись служебной учетной записью в Active Directory с использованием C# LDAP? Если да, то как?

Контекст: у меня есть программа, которая извлекает все объекты типа класса схемы USER, GROUP, COMPUTER, FOREIGN SECURITY PRINCIPAL и CONTACT. В настоящее время служебная учетная запись идентифицируется строкой, анализирующей каноническое имя для "служебной учетной записи". Мне не нравится это решение, потому что разбор строк зависит от расположения папки в иерархии, которая буквально говорит "учетная запись службы". Кажется возможным, что учетная запись службы может быть создана и затем помещена в путь к папке, который не содержит строку "учетная запись службы". К сожалению, я не могу проверить это, потому что я не администратор AD.

Я просмотрел онлайн без какой-либо удачи, поэтому я не уверен, возможно ли это вообще.

Обновить:

По мнению Microsoft, учетная запись службы содержится в объектном классе msDS-ManagedServiceAccount. Однако, когда я установил для фильтра DirectoryEntry значение msDS-ManagedServiceAccount, результаты не возвращаются.

directoryEntry = new DirectoryEntry(strActiveDirectoryHost, null, null, AuthenticationTypes.Secure);
string strDsFilter = "(objectClass=msDS-ManagedServiceAccount)";

DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry)
{
    Filter = strDsFilter,
    SearchScope = SearchScope.Subtree,
    PageSize = intActiveDirectoryPageSize,
};

return searchResultCollection = directorySearcher.FindAll();

2 ответа

Решение

Я тестировал ваш код, и он действительно возвращает результаты в моей среде. Несколько вещей, на которые стоит обратить внимание:

  • Будь уверен что strActiveDirectoryHost правильно отформатирован. Формат должен быть LDAP://DC=contoso,DC=com
  • Убедитесь, что вы ищете из корня (или достаточно высоко, чтобы найти учетные записи, которые вы ищете). MSA находятся под Managed Service Accounts контейнер под доменом NC (т.е. LDAP://CN=Managed Service Accounts,DC=contoso,DC=com)
  • В моих тестах я звоню new DirectoryEntry() только путь. Не уверен, если прохождение AuthenticationTypes.Secure вызывает проблему для вас
  • Объектный класс у вас правильный.

Поэтому я работаю над этим, чтобы получить MSA и создать их. Я могу получить MSA, используя пространство имен System.DirectoryServices.AccountManagement, все еще работая над его созданием (не уверен, действительно ли это возможно), но для поиска учетных записей, которые являются MSA, вы можете использовать следующий код

PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sDefaultOU, ContextOptions.SimpleBind, sServiceUser, sServicePassword);
GroupPrincipal currentGroup = GroupPrincipal.FindByIdentity(oPrincipalContext, "YourGroupName");
        foreach (Principal a_principal in currentGroup.GetMembers())
        {
            if (a_principal.StructuralObjectClass == "msDS-ManagedServiceAccount")
            {
                Console.Write(a_principal.SamAccountName); //To get the name
                ComputerPrincipal oComputerPrincipal = ComputerPrincipal.FindByIdentity(oPrincipalContext, a_principal.Name); //creating a computerprincipal to get more details about the MSA

            }
        }

Вы можете использовать вышеуказанную логику и создать принципал для учетной записи пользователя и получить класс структурных объектов для этой учетной записи, чтобы выяснить, является ли он MSA. Что-то вроде этого:

 UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
      if (oUserPrincipal.StructuralObjectClass == "msDS-ManagedServiceAccount")
                {
                    Console.Write(oUserPrincipal.SamAccountName); //To get the samaccountname
                }
Другие вопросы по тегам