使用PrincipalSearcher获取DFS共享

时间:2013-04-02 19:51:42

标签: c# winforms active-directory dfs

我正在尝试在Windows窗体中将代码从VB调整为C#。我仍然试图掌握DFS的概念,以及如何从Windows窗体中操作它。

VB使用GetObject("LDAP://RootDSE")函数使用DirectorySearcher在Active Directory中搜索共享。我已经调整了使用相同对象从用户ID返回UserPrincipal的其他函数,以及检查组是否已存在(使用GroupPrincipal)。这些通常是这样的:

public static UserPrincipal GetUserPrincipal(string userId) {
    PrincipalContext context = new PrincipalContext(ContextType.Domain);
    UserPrincipal user = new UserPrincipal(context);
    user.Name = userId;
    PrincipalSearcher searcher = new PrincipalSearcher(user);
    return searcher.FindOne() as UserPrincipal;
}

但是,我找不到任何包含我正在使用的关键字的文档,但我想获取一个DFS命名空间的目录列表(我认为)。

以下是VB中的(修改过的)代码:

Public Function GetDfsNamespaces() As List(Of String)
    Dim objRootDSE = GetObject("LDAP://RootDSE")
    Dim domain As String = objRootDSE.Get("DefaultNamingContext")
    Dim entry As New DirectoryEntry("LDAP://CN=DFs-Configuration,CN=System," & domain)
    Dim searcher As New DirectorySearcher(entry)
    searcher.PropertiesToLoad.Add("cn")
    searcher.Filter = "(objectClass=msDFS-NamespaceAnchor)"
    searcher.SearchScope = SearchScope.Subtree
    Dim results As SearchResultCollection = searcher.FindAll()
    Dim strResults As New List(Of String)
    For Each result In results
        strResults.Add(result.Properties("cn")(0))
    Next
    return strResults
End Function

我尝试查看UserPrincipalGroupPrincipalComputerPrincipal的来源,但未能弄清楚我是如何将Principal对象扩展为得到目录或其他东西。

1 个答案:

答案 0 :(得分:1)

前两行应该是这样的:

        string domain;
        using (DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"))
        {
            domain = rootDSE.Properties["defaultNamingContext"].Value.ToString();
        }

剩下的代码应该很容易转换。