有没有办法找到特定 AD 站点下的 PC 列表?我们以前为每个站点创建不同的 OU,这样可以更轻松地跟踪 PC。现在我们只有一个 OU,因此找到每个站点上的 PC 的唯一可行方法是通过 AD 站点获取 PC 列表。如果您能提供这方面的任何帮助,我们将不胜感激,或者有更好的方法吗?
答案1
开箱即用,计算机/站点信息不存储在 AD 中。但是,没有什么可以阻止您将其放在那里。您可以将计算机启动脚本或计划任务部署到域计算机,以便每台计算机将其当前分配的站点值写入其自己的 AD 计算机对象上的属性。只需授予“SELF”安全主体权限,即可修改您决定在后代计算机对象上使用的任何未使用的属性。然后可以轻松查询此信息以确定哪些客户端与哪个站点相关联。确保您的脚本考虑了未关联的客户端。
以下是一个示例 PowerShell 脚本,可以从已加入域的 Windows 客户端运行,不需要导入任何其他 PowerShell 模块。这会将当前 AD 站点值写入 AD 中计算机对象的“extensionattribute8”属性:
$obj = new-object -com ADSystemInfo
$type = $obj.gettype()
$adsite = $type.InvokeMember("sitename","GetProperty",$null,$obj,$null)
if($adsite -eq $null){$adsite = "UNKNOWN"}
$root = [ADSI]"LDAP://DC=Contoso,DC=com"
$search = [adsisearcher]$root
$name = $ENV:COMPUTERNAME
$Search.Filter = "(&(SamAccountName=$name$))"
$computer = $Search.FindOne() | foreach{$cproperties=$_.GetDirectoryEntry()}
$adsiteinad = $cproperties.extensionattribute8
if($adsiteinad -eq $adsite){}else{
$cproperties.extensionattribute8 = [string]$adsite
$cproperties.SetInfo()
}
只需将 DC=Contoso,DC=com 替换为您域的可分辨名称,并将“extensionattribute8”替换为您可用的任何未使用的单值属性。然后向针对后代计算机对象的属性授予“SELF”安全主体读/写权限。将该脚本作为系统计划任务或在 PowerShell 计算机启动脚本中运行,它将填充域计算机对象上的属性。该脚本将当前属性值与站点名称进行比较,并且仅在它们不匹配时才尝试写入 AD。这是为了防止对 AD 进行不必要的写入。显然,您应该在将其应用于大量计算机之前对此进行测试。
然后,您可以使用以下 PowerShell 命令查询域中分配给特定站点的所有计算机:
Get-ADComputer -Filter 'extensionAttribute8 -eq "SITENAME"'
答案2
实际上,你不能。机器不会与 AD 中的站点关联(就其本身而言)。
子网与站点相关联,因此在任何时候,您都可以对与站点相关联的子网进行 NMap 扫描,以获取 IP 列表,然后您可以将其与计算机名称列表关联起来。但仅在该时间点有效。
场景:销售部的劳拉经常在丹佛,但今天她要去亚特兰大办公室。不同的站点,但没有人对 AD 进行任何更改,无论是管理员还是幕后人员。她的笔记本电脑知道它目前在哪个站点,因为该站点控制着有关登录过程等的事情。
那么请让我问一下 - 您要解决什么问题?您想要什么样的最终状态?您需要按站点跟踪机器吗?获取库存解决方案。
答案3
此信息未存储或维护在 AD 中。
客户端将其站点信息存储在注册表中。
可以使用以下命令远程收集客户端的站点信息:
nltest /服务器:计算机名/dsgetsite
答案4
这不是您问题的直接答案,而是一种替代方法。因为 Active Directory 不存储您要查找的信息,并且手动扫描或运行脚本来循环遍历所有计算机可能会非常耗时。
由于站点基于计算机所在的子网,因此库存软件可以为您提供一种很好的方法来查找一个或多个子网中的所有机器。
对于我们的域名,我们使用PDQ 库存。它允许在后台自动扫描,并动态收集列出具有指定参数的所有计算机。您可以为每个站点创建一个集合,它们都会动态更新。它们的价格相当合理,特别是如果您开始使用它们的更多功能。