当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 PowerShell 中爬树

作者:精品下载站 日期:2024-12-14 08:01:57 浏览:16 分类:玩电脑

在 PowerShell 中爬树


我将继续对 Active Directory 以及如何利用 PowerShell 重新产生兴趣。这是我从 PowerShell v2 时代起就一直在研究的一个主题。我有很多旧代码。我决定把其中一些灰尘掸掉并擦亮。我一直感兴趣的一个主题是显示 Active Directory 域的可视化表示或树。

列出组织单位

列出您的 OU 并不是特别困难。

Get-ADOrganizationalUnit -Filter * -Properties canonicalname | Sort-Object -property canonicalname | Select-object -property CanonicalName

我之所以包含规范名称,是为了更容易以分层方式进行排序。

[玩转系统] 在 PowerShell 中爬树

更改显示以使用专有名称非常容易。

Get-ADOrganizationalUnit -Filter * -Properties canonicalname | Sort-Object -property canonicalname | Select-object -property DistinguishedName

[玩转系统] 在 PowerShell 中爬树

但这实际上只是一个列表。

显示层次结构

我缺少的是子组织单位的直观表示。我可以采取的一种方法是从域中的根级 OU 开始,并递归地获取子 OU。然后我可以设置子级的格式以反映层次结构。我仍然可以使用 Get-ADOrganzationalUnit,但需要进行一些更改。

这是一个参数化脚本块。

$get = {param([string]$path,[int]$indent = 2)
  $ous = Get-ADOrganizationalUnit -Filter * -Properties canonicalname -SearchBase $path -SearchScope OneLevel
  foreach ($child in $ous) {
    $tab = "-" * $indent
    "|{0} {1}" -f $tab, $child.name
    &$get -path $child.distinguishedname -indent ($indent+=2)
    $indent-=2
  }
}

脚本块正在获取给定位置中的所有 OU,如 SearchBase 参数所指定。而且仅获得当前级别的 OU。这是 OneLevel 的 SearchScope 参数。我不想让它递归。然后,我为每个子项构建一个带有 OU 名称的字符串,该字符串缩进以反映层次结构。

我将从根域运行它。

(Get-ADDomain).Name;invoke-command $get -ArgumentList "DC=company,dc=pri"

[玩转系统] 在 PowerShell 中爬树

更改代码以显示专有名称将非常简单。

这是一个很好的开始,但你知道我会看看我能走多远。

显示域

我想要一个从控制台提示符运行的简单命令来生成域树。这意味着我需要编写一个函数。另一个变化,也是一个主要的变化,是在与我的朋友 Gladys Kravitz 讨论后,我意识到有时我也想包含像 CN=Users 这样的容器。

要获取容器,我无法使用 Get-ADOrganizationalUnit。没有相应的容器命令,但我可以使用 Get-ADObject。

Get-ADObject -ldapfilter "objectclass=container"

[玩转系统] 在 PowerShell 中爬树

顺便说一句,我也可以用这种过滤语法来编写这个。

Get-ADObject -filter "objectclass -eq 'container'"

两者之间确实没有太大区别。

默认情况下,我的函数将仅显示组织单位,但如果我指定一个参数来显示容器,我将需要相应地修改我的 LDAP 过滤器。

if ($Containers) {
    $filter = "(|(objectclass=container)(objectclass=organizationalUnit))"
  }
  else {
    $filter = "objectclass=organizationalUnit"
  }

然后,我的函数可以格式化每个子项并显示缩进和特殊字符以显示树“分支”。我还决定利用 ANSI 并用不同的颜色显示项目。

if ($_.ProtectedFromAccidentalDeletion) {
    #display protected OUs in color
    $nameValue = "$([char]0x1b)[38;5;199m$name$([char]0x1b)[0m"
}
elseif ($_.objectclass -eq 'container') {
    $nameValue = "$([char]0x1b)[38;5;3m$name$([char]0x1b)[0m"
}
elseif ($_.objectclass -ne 'organizationalUnit') {
    #display non-OU and non-Container in a different color
    $nameValue = "$([char]0x1b)[38;5;211m$name$([char]0x1b)[0m"
}
else {
    $nameValue = "$([char]0x1b)[38;5;191m$name$([char]0x1b)[0m"
}

它看起来是这样的。

[玩转系统] 在 PowerShell 中爬树

如果需要,我可以显示容器,并且还可以使用专有名称输出。

[玩转系统] 在 PowerShell 中爬树

我应该指出,这不是一个包罗万象的域树。我正在过滤掉 CN=Operations、CN=DomainUpdates、CN=System 下具有基于 GUID 名称的容器。

[玩转系统] 在 PowerShell 中爬树

我个人认为将它们包含在输出中没有任何价值。

该函数将字符串写入管道,因此您可以通过管道传输到 Out-File。文件内容将包含转义字符。这很棒,因为您可以在文件上使用 Get-Content 来重新显示彩色树。

您需要在支持 ANSI 和扩展字符的 PowerShell 主机中运行该函数。您很可能在 PowerShell ISE 或 VS Code 中得到较差的结果。

我已将该函数作为要点发布在 GitHub 上:https://gist.github.com/jdhitsolutions/895d44d68ac4f9523257393d9d4a38d8

该功能将允许您指定域控制器并支持备用凭据。它要求您安装 ActiveDirectory 模块。

奖金

正如我所提到的,我已经使用 PowerShell 和 Active Directory 编写脚本很长时间了。下面是一个使用 ADSI 和 DirectoryServices .NET 类构建域树的函数。此功能不需要 Active Directory 模块。

Function Get-DSTree {
  [cmdletbinding()]
  [OutputType("string")]
  Param(
      [ADSI]$ADSPath="LDAP://DC=company,DC=Pri",
      [int]$Indent=0
      )

  [string]$leader=" "
  [int]$pad = $leader.length+$indent

  $searcher = New-Object directoryservices.directorysearcher
  $searcher.pagesize=100
  #get containers and OUs
  #$searcher.Filter = "(|(objectclass=container)(objectclass=organizationalUnit))"

  #get only OUs
  $Searcher.filter = "(&(objectclass=organizationalUnit))"
  $searcher.searchScope="OneLevel"
  $searcher.searchRoot = $ADSPath
  [void]$searcher.PropertiesToLoad.Add("DistinguishedName")

  $searcher.FindAll() | ForEach-Object {
   $branch = "{0}{1}" -f ($leader.Padleft($pad,$leader),$_.properties.distinguishedname[0])
   $branch
    Get-DSTree -ADSPath $_.path -indent ($pad+2)
  }
}

[玩转系统] 在 PowerShell 中爬树

我还有一些与此主题相关的想法,因此请务必在 Twitter 上关注我或订阅我,这样您就不会错过。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯