问题:是否可以使用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();
答案 0 :(得分:1)
我测试了你的代码,实际上它确实在我的环境中返回结果。有几点需要注意:
strActiveDirectoryHost
格式正确。格式应为LDAP://DC=contoso,DC=com
Managed Service Accounts
容器下(即LDAP://CN=Managed Service Accounts,DC=contoso,DC=com
)new DirectoryEntry()
。不确定传递AuthenticationTypes.Secure
是否导致问题答案 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
}