1

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

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

因此,通过一个例子来说明这个问题 -

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

$users = 获取 ADUser

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

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

丹跳吉姆威尔逊

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

丹跳

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

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

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

4

2 回答 2

1

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

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

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

于 2012-12-28T09:13:40.360 回答
0

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

我看不出这是程序员特有的吗?这听起来像网络故障排除?无论如何...

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

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

$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 上的AD-GetComputer cmdlet

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

Identity 参数指定要检索的 Active Directory 计算机。您可以通过可分辨名称 (DN)、GUID、安全标识符 (SID) 或安全帐户管理器 (SAM) 帐户名称来识别计算机。您还可以将参数设置为计算机对象变量,例如 $ 或通过管道将计算机对象传递给 Identity 参数。

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

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

于 2012-11-13T17:37:57.147 回答