Active Directory:如何确定帐户是否为服务帐户?

时间:2018-05-14 20:16:31

标签: c# active-directory ldap

问题:是否可以使用C#LDAP确定帐户是否是Active Directory中的服务帐户?如果有,怎么样?

上下文:我有一个程序正在检索架构类类型USER,GROUP,COMPUTER,FOREIGN SECURITY PRINCIPAL和CONTACT的所有对象。目前,通过解析“服务帐户”的规范名称的字符串来标识服务帐户。我不喜欢这个解决方案,因为字符串解析依赖于层次结构中的文件夹位置,字面意思是“服务帐户”。似乎可以创建服务帐户,然后将其放置在不包含字符串“服务帐户”的文件夹路径中。不幸的是,我无法测试这个,因为我不是AD管理员。

我在网上浏览时没有任何运气,所以我不确定它是否可能。

更新

Microsoft,服务帐户似乎包含在objectClass 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 个答案:

答案 0 :(得分:1)

我测试了你的代码,实际上它确实在我的环境中返回结果。有几点需要注意:

  • 确保strActiveDirectoryHost格式正确。格式应为LDAP://DC=contoso,DC=com
  • 检查您是否从根目录进行搜索(或者足够高以查找您要查找的帐户)。 MSA位于NC域下的Managed Service Accounts容器下(即LDAP://CN=Managed Service Accounts,DC=contoso,DC=com
  • 在我的测试中,我只使用路径调用new DirectoryEntry()。不确定传递AuthenticationTypes.Secure是否导致问题
  • 你拥有的objectClass是正确的。

答案 1 :(得分:0)

因此,我正在努力获得MSA并进行创建。我能够使用System.DirectoryServices.AccountManagement命名空间获取MSA,但仍在努力创建它(不确定是否确实可行) 但是要查找属于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

            }
        }

您可以使用上面的逻辑为用户帐户创建一个Principal,并获取该帐户的结构对象类以查明它是否为MSA。 像这样:

 UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
      if (oUserPrincipal.StructuralObjectClass == "msDS-ManagedServiceAccount")
                {
                    Console.Write(oUserPrincipal.SamAccountName); //To get the samaccountname
                }