【问题标题】:Active Directory / Powershell - How to identify if a server, in a federated cluster, is downActive Directory / Powershell - 如何识别联合集群中的服务器是否已关闭
【发布时间】:2012-11-13 17:19:12
【问题描述】:

这个问题是在一个在 DC 服务器上运行(或正在远程访问 DC)的服务的上下文中,这样该服务可以访问 Active Directory,但该服务不知道 Active Directory 服务器有多少服务器应该有,服务器地址是什么,等等......

此外,必须在 Active Directory 设置可能涉及一组联合服务器的假设下编写服务。

所以通过一个例子来说明问题 -

假设我正在尝试通过 Powershell v2(或者您可以使用目录服务)运行一个非常简单的 AD 查询,以获取所有 ADUser:

$users = 获取 ADUser

现在让我们假设示例公司 Contoso 在纽约(用于其纽约办事处)和西雅图(用于其西雅图办事处)有一个 AD 服务器。此外,该服务将指向作为纽约数据中心服务器的 DC。

所以为了简单起见,假设 $users 返回两个用户对象,其显示名称属性为:

丹跳 吉姆·威尔逊

现在让我们假设西雅图服务器已关闭,所以我再次运行查询并得到:

丹跳

据我了解 - AD 不会返回指示西雅图服务器已关闭的错误..它只会返回它可以找到的用户..

我知道可以检测到已删除的对象,因此,如果我保存了所有用户的列表,我可能会验证该用户是否已被删除...但这有点开销,特别是如果我感兴趣的不仅仅是只是一个用户列表

那么有没有办法在我运行查询之前检测到联合集群中的一个或多个 AD 服务器已关闭?

【问题讨论】:

  • 1. “AD服务器”的“联合集群” - 你能澄清一下吗? AD 出现在域和林中。您可以在域之间和林之间建立信任,但通常“联合”一词适用于 SAML 或 WS-Federation 方案。 2. 由于 DC Locator 机制,不必将应用程序配置为知道 DC 名称。 3. Active Directory 使用多主机复制,这提供了与收敛的松散一致性,这意味着域内的所有用户最终都应该在每个 DC 上。鉴于所有这些,您的问题对我来说没有多大意义。你能澄清一下吗?
  • 我正在讨论一个 WS-Federation 场景,但这只是为了说明一种可能的场景。将运行此查询的程序是在 Active Directory 域控制器上运行的服务,因此该服务完全不知道域和林之间的信任。该服务使用目录服务获取所有用户和组信息,只要它有权查看所有林和域。可以假设服务可以访问它需要的东西,但我不清楚如何识别什么时候丢失了
  • ...一些 AD 版本可能较旧,但我试图说明的示例应该是一个实际示例。虽然我确信你的观点主要是有效的,但我被告知我将有几种情况我不能依赖复制(基于历史经验)并且将不得不面对这样一个事实,即某些数据可能存在于某些服务器上有时可能无法访问。如果这没有意义,那么我只需要回到告诉我情况的人那里......
  • ...但这些是我收到的卡片,我无法控制我将使用的服务器的 Exchange 设置。我之前没有在 Exchange 上做过很多工作,所以如果我的解释令人沮丧,请原谅我。我只是想弄清楚这一点,但似乎找不到合适的搜索词......或者我只是在追鬼:/如果你认为我确实在追鬼,请告诉我 :)
  • 抱歉延迟回复 - 我不像以前那样经常来这里,因为 IMO 的一些节制过于热情,破坏了这个地方的气氛。无论如何,首先 WS-Federation 与您要解决的问题无关,因此您可以搁置他们告诉您的任何内容。该服务可能不知道域拓扑,但是一旦您可以访问 DC,就可以通过查询获得所需的信息。而且,如果他们不能依赖复制,AD 就会损坏。

标签: powershell active-directory powershell-2.0 directoryservices


【解决方案1】:

在使用以下任何内容之前,您可能想阅读this。 S.DS 和 S.DS.AD 抽象了很多发生的事情,但其中有很多有用的信息,它可能会帮助您阐明您的要求。

我不知道有一个函数可以返回已关闭的 DC,但 System.DirectoryServices.ActiveDirectory 命名空间包含您需要确定域拓扑的类。例如,Forest 类将返回Domain 对象的集合(以及Sites 和许多其他有用的属性)。 Domain 将允许您访问 DomainController 对象的集合(以及 Children 和父域以及许多其他道具和方法)。

您可以遍历域以获取所有 DC,然后遍历 DC 并尝试 ping,尽管这在安全且分段的网络中可能不起作用。您可能会考虑尝试使用 S.DS.DirectoryEntry 连接到每个 DC,因为这在任何情况下都可以从 DC 工作。当然,如果您的网络人员对他们的锁定过于热心,那么即使这样也可能行不通。

【讨论】:

    【解决方案2】:

    这听起来像是 www.serverfault.com 优秀人才的工作

    我看不出这是程序员特有的吗?这听起来像网络故障排除?总之……

    IMO,这取决于您的联合服务器所在的位置。他们在云端吗?它们是虚拟的吗?如果是这样,通过对服务器平台的简单 API 调用,很容易检测到它们何时出现故障。

    或者您可以尝试实现服务器 ping 机制,例如本网站上的示例 here

    $servers = Get-Content 'servers.txt'
    ForEach-Object ($server in $servers) {
       # Ping the machine to see if it's on the network
       $results = Get-WMIObject -query "select StatusCode from
    Win32_PingStatus where Address = '$server'"
       $responds = $false  
       ForEach-Object ($result in $results) {
          # If the machine responds break out of the result loop and indicate success
          if ($result.statuscode -eq 0) {
             $responds = $true
             break
          }
       }
             If ($responds) {
          # Gather info from the server because it responds
          Write-Output "$server responds"
       } else {
          # Let the user know we couldn't connect to the server
          Write-Output "$server does not respond"
       }
    }
    

    ** 这假设您的服务器是“可ping 通的”。

    您也可以使用 MS Technet here.

    上的 AD-GetComputer cmdlet

    Get-ADComputer cmdlet 获取一台计算机或执行搜索以检索多台计算机。

    Identity 参数指定 Active Directory 计算机 取回。您可以通过其专有名称 (DN) 来识别计算机, GUID、安全标识符 (SID) 或安全帐户管理器 (SAM) 帐户名称。您还可以将参数设置为计算机对象 变量,例如 $ 或传递一个计算机对象 通过管道到 Identity 参数。

    要搜索和检索多台计算机,请使用过滤器或 LDAPFilter 参数。 Filter 参数使用 PowerShell 表达式语言为 Active Directory 编写查询字符串。 PowerShell 表达式语言语法提供丰富的类型转换 支持 Filter 参数接收的值类型。更多 有关过滤器参数语法的信息,请参阅 about_ActiveDirectory_Filter。如果您有现有的 LDAP 查询字符串, 您可以使用 LDAPFilter 参数。

    此 cmdlet 检索一组默认的计算机对象属性。到 使用 Properties 参数检索其他属性。更多 有关如何确定计算机属性的信息 对象,请参阅属性参数说明。

    【讨论】:

    • 这没有回答问题:“服务不知道 Active Directory 服务器、应该有多少服务器、服务器地址是什么等等......”
    • 如果您甚至不知道您有 AD 服务器,如何运行 AD 查询?这个问题永远不会有答案,因为它太模糊和开放式。
    • 那么需要注意的是“这个问题是在 DC 服务器上运行的服务的上下文中(或远程访问 DC)”......所以如果你运行一个 powershell 查询像“Get-ADUser”一样,它将获取所有用户,包括该联合服务器组中其他服务器上存在的用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多