如何列出 Active Directory 中的所有站点及这些站点内的所有服务器?

来源:互联网 发布:软件快捷方式打不开 编辑:程序博客网 时间:2024/06/06 09:42
 
问:

您好,脚本专家!如何列出 Active Directory 中的所有站点及这些站点内的所有服务器?

-- DW

答:

您好,DW。您知道,您这是在考验我们。如果咨询有关用户和组的问题,我们会处理得很好;我们至少在一定程度上了解用户和组所涉及的内容。如果咨询有关计算机帐户或 OU 的问题;也不要紧。不过,如果问题是站点、站点链接及类似方面的问题,则我们就开始担心了;毕竟,我们连那些内容是什么都没有真正弄懂过,更别提您如何使用脚本处理它们了。

但是,缺少知识和理解不足曾经让脚本专家止步不前过吗?当然没有。下面的脚本会列出 Active Directory 中的所有站点以及所有这些站点中的服务器:

On Error Resume NextSet objRootDSE = GetObject("LDAP://RootDSE")strConfigurationNC = objRootDSE.Get("configurationNamingContext") strSitesContainer = "LDAP://cn=Sites," & strConfigurationNCSet objSitesContainer = GetObject(strSitesContainer)objSitesContainer.Filter = Array("site") For Each objSite In objSitesContainer    Wscript.Echo objSite.CN    strSiteName = objSite.Name    strServerPath = "LDAP://cn=Servers," & strSiteName & ",cn=Sites," & _        strConfigurationNC    Set colServers = GetObject(strServerPath)     For Each objServer In colServers        WScript.Echo vbTab & objServer.CN    Next    Wscript.EchoNext

那么,我们将通过这段代码执行何种操作呢?(实际上,这并不是一句反问句,我们希望有人就该段代码向我们做一下全面解释!)我们首先使用以下两行代码来绑定到 Active Directory 根目录,而后再绑定到 Configuration 容器 (configuringNamingContext):

Set objRootDSE = GetObject("LDAP://RootDSE")strConfigurationNC = objRootDSE.Get("configurationNamingContext")

我们为什么要这样开始呢?Configuration 容器中包含 Active Directory 的物理结构和布局方面的信息;我们还将在其中找到站点及分配给每个站点的服务器的信息。不管域名如何,我们都可通过先绑定到 Active Directory 根目录 (rootDSE),而后再使用 Get 方法检索 configurationNamingContext 的方式来获取 Configuration 容器的 Active Directory 路径。

注意:这意味着什么?其中一点,它意味着您可以按原样使用此脚本,而无需将 fabrikam.com 更改为您的域名;正如您所看到的,我们甚至没有在脚本中的任何位置引用 fabrikam.com(或任何其他域名)。

下一步将检索所有 Active Directory 站点的集合。这就是下面的代码所要执行的操作:

strSitesContainer = "LDAP://cn=Sites," & strConfigurationNCSet objSitesContainer = GetObject(strSitesContainer)objSitesContainer.Filter = Array("site")

在第一行中,我们构造了 Sites 容器的 ADsPath,方法是将 LDAP://cn=Sites 与 configurationNamingContext 合并到了一起。我们使用 GetObject 方法绑定到该容器,然后应用一个 Filter,将集合中的项目限定为 Site 对象。最终结果为:objSitesContainer 现在将包含一个所有 Active Directory 站点的集合。

好了,这也许不像我们事先所想的那么难。接下来,我们建立一个 For Each 循环,以遍历该站点集合。在该循环内,我们回显该集合中第一个站点的 CN,然后将该站点的 Name(其类似于 CN=Default-First-Site-Name)存储在变量 strSiteName 中:

Wscript.Echo objSite.CNstrSiteName = objSite.Name

实际上,每个 Active Directory 站点均有一个 Servers 容器,且每个 Servers 容器中均含有一个分配给该站点的服务器的列表。为了绑定到第一个站点的 Servers 容器,我们使用下面一行代码来构造 ADsPath(即,存储在变量 strServerPath 中的路径):

strServerPath = "LDAP://cn=Servers," & strSiteName & ",cn=Sites," & _    strConfigurationNC

获取 ADsPath 后,我们即可使用下面一行代码来绑定到第一个站点的 Servers 容器:

Set colServers = GetObject(strServerPath)

我们现在继续进行。接下来,我们再建立一个 For Each 循环,以遍历 Servers 容器中的项目的集合。对于集合中的每个服务器,我们只需回显该服务器的 CN:

For Each objServer In colServers    WScript.Echo vbTab & objServer.CNNext

哦,好的:我们还会在服务器名称的前面加上一个制表符 (vbTab)。只要您看一看示例输出,您就会明白我们为什么要这样做了。

这就是您想要的结果:我们现在已经回显了第一个站点的名称和分配给该站点的所有服务器。然后,我们进入下一个循环并对集合中的第二个站点重复此过程。这样继续下去,直到我们处理完所有站点并回显了这些站点中的所有服务器的名称为止。完成后,应得到类似下面内容的输出:

Default-First-Site-Name    atl-dc-01    atl-dc-02European-Site    lon-dc-01    lon-dc-02    par-dc-01    bru-dc-01    bru-dc-02

还不错吧?设想一下,要是我们实际上知道正做的事情,我们会写出多么酷的脚本!

原创粉丝点击