1

我正在尝试以 Windows 形式将代码从 VB 改编为 C#。我仍在尝试总体上了解 DFS 的想法,以及如何从 Windows 窗体中操作它。

VB 使用该GetObject("LDAP://RootDSE")功能在 Active Directory 中搜索使用DirectorySearcher. 我已经调整了使用相同对象的其他函数UserPrincipal从用户 id 返回 a ,以及检查 Group 是否已经存在(使用 a 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对象以获取目录或其他内容。

4

1 回答 1

1

前两行应该是这样的:

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

其余代码应该可以直接转换。

于 2013-04-02T20:17:01.543 回答