【问题标题】:active directory remote access活动目录远程访问
【发布时间】:2020-01-07 11:51:49
【问题描述】:

我已经在 aws EC2 机器 windows 2012 上设置了一个活动目录。 它在本地工作得很好。我已经安装了 Active Directory Explorer,并且在本地我可以查看用户等...

问题是我正在尝试使用 ldap(使用 c#)从网络外部的计算机进行连接。 由于我的 EC2 有一个公共 ip,我能够成功登录。 所以 ValidateCredentials c# 函数通过 OK 。

问题是,当我尝试从特定路径查询以获取用户时,我得到一个异常: 我调用函数: DirectoryEntry.Exists("LDAP://OU=Students,DC=hadoop,DC=com") 而且无论我尝试什么路径都行不通。 我得到的例外是: “指定的域不存在或无法联系”。

我认为问题在于本地 hadoop.com 无法从网络外部访问,因为它没有公共 IP - 它是我在本地创建的林名。

如何解决这个问题,以便我可以从网络外部的电脑连接到我的活动目录服务器?

非常感谢

【问题讨论】:

  • 您只能连接到该文件夹​​是您可以 ping 服务器并且驱动器是共享的。如果 PC 不在公共网络上(在防火墙后面)通过​​某种端口转发来通过防火墙。
  • 我关闭了防火墙。它仍然不起作用?知道如何进行吗?
  • 它必须是公共 IP 地址,这样 IP 才能通过网络进行广告。远程机器需要到 IP 的路由。通过端口转发,远程机器可以发送到防火墙,然后防火墙会识别端口号并转发到专用网络。
  • 我的 ec2 机器确实有一个公共地址。但是我里面的域没有公共IP。防火墙已关闭,因此没有任何影响。你能解释一下我应该怎么做,因为我有点困惑吗?
  • 我认为您的防火墙内有一个专用网络。公共地址意味着外部世界(互联网)可以直接连接到一台机器。为了能够连接本地机器和远程机器之间必须存在路由。 IP 地址必须是唯一的,这样互联网上的其他机器就没有相同的 IP。所以 PING 将在远程和本地机器之间工作。如果它是公共 IP,则防火墙未正确转发消息。因此,您可能会遇到防火墙上的掩码问题或 DNS 问题。

标签: c# active-directory


【解决方案1】:

所以你正在这样做:

DirectoryEntry.Exists("LDAP://OU=Students,DC=hadoop,DC=com")

而且它不起作用。你有两个问题。

  1. 当您提供仅具有此类可分辨名称的 LDAP 路径时,Windows 会将请求发送到计算机加入的域。如果对象在同一个域上,一切都很好。如果它在受信任的域上,DC 会返回一个推荐(“我不能告诉你那是什么,但我知道谁可以”)并且您的计算机会向另一个 DC 发起一个新请求。由于您从中运行它的计算机未加入该域或受信任域,因此它不知道去哪里找到该对象,因此引发异常。所以你必须告诉它去哪里。您可以通过在路径中包含域名(或特定 DC 名称,如果需要)来做到这一点:
LDAP://hadoop.com/OU=Students,DC=hadoop,DC=com
  1. 但您还需要传递凭据,DirectoryEntry.Exists 不支持。但是,source code is available 所以你可以窃取和修改™ 来制作一个接受凭据的版本:
public static bool Exists(string path, string username, string password)
{
    DirectoryEntry entry = new DirectoryEntry(path, username, password);
    try
    {
        _ = entry.NativeObject;       // throws exceptions (possibly can break applications)
        return true;
    }
    catch (System.Runtime.InteropServices.COMException e)
    {
        if (e.ErrorCode == unchecked((int)0x80072030) ||
             e.ErrorCode == unchecked((int)0x80070003) ||   // ERROR_DS_NO_SUCH_OBJECT and path not found (not found in strict sense)
             e.ErrorCode == unchecked((int)0x800708AC))     // Group name could not be found
            return false;
        throw;
    }
    finally
    {
        entry.Dispose();
    }
}

你必须做的一个改变是改变Bind的使用,因为这是internal的方法,不能被像我们这样的凡人使用。相反,我只获得了NativeObject 属性,即calls Bind() for us

你可以这样使用:

var ouExists = Exists("LDAP://hadoop.com/OU=Students,DC=hadoop,DC=com", "username", "password");

【讨论】:

    【解决方案2】:

    确保您的安全组已启用对 LDAP 和活动目录端口的访问

    https://docs.netapp.com/us-en/cloud_volumes/aws/reference_security_groups_windows_ad_servers.html

    【讨论】:

    • 谢谢,id 做到了,但它仍然不起作用 - 同样的异常.....
    • 还注意到 ValidateCredentials 功能正在工作,这意味着我通过了防火墙并且凭证没问题。访问路径存在问题,该路径是我创建的名为 hadoop.com 的 Windows 服务器内的域...
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多