如何列出 Active Directory 中的所有站点及这些站点内的所有服务器?
2008-10-24 09:38
316 查看
问:
您好,脚本专家!如何列出 Active Directory 中的所有站点及这些站点内的所有服务器?
-- DW
答:
您好,DW。您知道,您这是在考验我们。如果咨询有关用户和组的问题,我们会处理得很好;我们至少在一定程度上了解用户和组所涉及的内容。如果咨询有关计算机帐户或 OU 的问题;也不要紧。不过,如果问题是站点、站点链接及类似方面的问题,则我们就开始担心了;毕竟,我们连那些内容是什么都没有真正弄懂过,更别提您如何使用脚本处理它们了。
但是,缺少知识和理解不足曾经让脚本专家止步不前过吗?当然没有。下面的脚本会列出 Active Directory 中的所有站点以及所有这些站点中的服务器:
那么,我们将通过这段代码执行何种操作呢?(实际上,这并不是一句反问句,我们希望有人就该段代码向我们做一下全面解释!)我们首先使用以下两行代码来绑定到 Active Directory 根目录,而后再绑定到 Configuration 容器 (configuringNamingContext):
我们为什么要这样开始呢?Configuration 容器中包含 Active Directory 的物理结构和布局方面的信息;我们还将在其中找到站点及分配给每个站点的服务器的信息。不管域名如何,我们都可通过先绑定到 Active Directory 根目录 (rootDSE),而后再使用 Get 方法检索 configurationNamingContext 的方式来获取 Configuration 容器的 Active Directory 路径。
下一步将检索所有 Active Directory 站点的集合。这就是下面的代码所要执行的操作:
在第一行中,我们构造了 Sites 容器的 ADsPath,方法是将 LDAP://cn=Sites 与 configurationNamingContext 合并到了一起。我们使用 GetObject 方法绑定到该容器,然后应用一个 Filter,将集合中的项目限定为 Site 对象。最终结果为:objSitesContainer 现在将包含一个所有 Active Directory 站点的集合。
好了,这也许不像我们事先所想的那么难。接下来,我们建立一个 For Each 循环,以遍历该站点集合。在该循环内,我们回显该集合中第一个站点的 CN,然后将该站点的 Name(其类似于 CN=Default-First-Site-Name)存储在变量 strSiteName 中:
实际上,每个 Active Directory 站点均有一个 Servers 容器,且每个 Servers 容器中均含有一个分配给该站点的服务器的列表。为了绑定到第一个站点的 Servers 容器,我们使用下面一行代码来构造 ADsPath(即,存储在变量 strServerPath 中的路径):
获取 ADsPath 后,我们即可使用下面一行代码来绑定到第一个站点的 Servers 容器:
我们现在继续进行。接下来,我们再建立一个 For Each 循环,以遍历 Servers 容器中的项目的集合。对于集合中的每个服务器,我们只需回显该服务器的 CN:
哦,好的:我们还会在服务器名称的前面加上一个制表符 (vbTab)。只要您看一看示例输出,您就会明白我们为什么要这样做了。
这就是您想要的结果:我们现在已经回显了第一个站点的名称和分配给该站点的所有服务器。然后,我们进入下一个循环并对集合中的第二个站点重复此过程。这样继续下去,直到我们处理完所有站点并回显了这些站点中的所有服务器的名称为止。完成后,应得到类似下面内容的输出:
还不错吧?设想一下,要是我们实际上知道正做的事情,我们会写出多么酷的脚本!
您好,脚本专家!如何列出 Active Directory 中的所有站点及这些站点内的所有服务器?
-- DW
答:
您好,DW。您知道,您这是在考验我们。如果咨询有关用户和组的问题,我们会处理得很好;我们至少在一定程度上了解用户和组所涉及的内容。如果咨询有关计算机帐户或 OU 的问题;也不要紧。不过,如果问题是站点、站点链接及类似方面的问题,则我们就开始担心了;毕竟,我们连那些内容是什么都没有真正弄懂过,更别提您如何使用脚本处理它们了。
但是,缺少知识和理解不足曾经让脚本专家止步不前过吗?当然没有。下面的脚本会列出 Active Directory 中的所有站点以及所有这些站点中的服务器:
On Error Resume Next Set objRootDSE = GetObject("LDAP://RootDSE") strConfigurationNC = objRootDSE.Get("configurationNamingContext") strSitesContainer = "LDAP://cn=Sites," & strConfigurationNC Set 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.Echo Next
那么,我们将通过这段代码执行何种操作呢?(实际上,这并不是一句反问句,我们希望有人就该段代码向我们做一下全面解释!)我们首先使用以下两行代码来绑定到 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(或任何其他域名)。 |
strSitesContainer = "LDAP://cn=Sites," & strConfigurationNC Set 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.CN strSiteName = 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.CN Next
哦,好的:我们还会在服务器名称的前面加上一个制表符 (vbTab)。只要您看一看示例输出,您就会明白我们为什么要这样做了。
这就是您想要的结果:我们现在已经回显了第一个站点的名称和分配给该站点的所有服务器。然后,我们进入下一个循环并对集合中的第二个站点重复此过程。这样继续下去,直到我们处理完所有站点并回显了这些站点中的所有服务器的名称为止。完成后,应得到类似下面内容的输出:
Default-First-Site-Name atl-dc-01 atl-dc-02 European-Site lon-dc-01 lon-dc-02 par-dc-01 bru-dc-01 bru-dc-02
还不错吧?设想一下,要是我们实际上知道正做的事情,我们会写出多么酷的脚本!
相关文章推荐
- SQL : 如何完全复制一个服务器上的数据库A到另一个服务器上的数据库B(包括库A的所有表、试图、存储过程等等)
- 如何使用 Apache Web 服务器配置多个站点
- 服务器宽带性能如何?----internet性能测试站点汇集
- 如何用命令打包一个站点,包括其所有目录文件
- 如何把web站点的所有.aspx.cs文件编译为.dll文件?
- 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
- 如何列出某个目录下的所有文件?
- 如何在一台服务器上实现多个web站点(IIS方法)
- 虚拟主机中,如何知道服务器上已安装的所有字体的列表?
- 如何列出所有的 Bash Shell 内置命令 | Linux 中国
- 如何列出C盘下所有的txt文件
- 在R5中如何将一个Domino Web服务器配置为多个Web站点--虚拟服务器
- 列出服务器上所有用户数据库+表+存储过程+触发器
- 在服务器上 .netFramework2.0 环境下,如何能在不改变服务器设置下,让站点能够运行 AJAX 程序
- 如何把一个基于Maven项目所有的jar文件快速列出到Excel?
- Window 2008 iis7.5服务器导出当前所有站点的方法
- 如何列出npm模块所有的历史版本?
- jQuery ajax 如何将文件与所有的表单数据上传到 ASP.NET服务器
- 如何让以特定字符串结尾的所有站点都被加入到Local Intranet Zone中?
- linux C如何获取服务器节点上所有网口的ip地址