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

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

作者:精品下载站 日期:2024-12-14 03:43:33 浏览:15 分类:玩电脑

如何在 PowerShell 中使用 Get-ADGroup


您是否需要获取 Active Directory 中的所有组,或者只需要查找隐藏在 OU 中某处的一个组的位置?在PowerShell中,我们可以使用Get-ADGroup cmdlet从AD中快速提取有关我们组的所有信息。

Active Directory 中的组确实可以帮助您保持 AD 井井有条。它允许您向属于单个组成员的多个用户分配权限或许可证。例如,当管理层需要访问 PowerBi 时,您只需将许可证分配给 PowerBi 组。

在本文中,我们将了解如何在 PowerShell 中使用 Get-ADGroup cmdlet。在本文末尾,您还将找到一个完整的脚本,可将 Active Directory 中的所有组导出到 CSV。

要求

在使用 Get-ADGroup cmdlet 之前,您需要在 PowerShell 中安装 Active Directory 模块。它默认安装在域控制器上,但在 Windows 10 或 11 上,您将需要安装它。

在 PowerShell 中运行以下命令来安装模块:

Add-WindowsCapability -online -Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0”

在 PowerShell 中使用 Get ADGroup 查找组

Get Get-ADGroup cmdlet 允许我们查找 Active Directory 中的所有组对象并从中提取信息。此 cmdlet 的优点是我们可以使用不同的参数来查找 AD 中的组。

在查找组时,我们可以使用以下参数:

  • 身份 - 根据群组名称查找群组。这将只返回一个组
  • 过滤器 - 根据过滤器查询检索多个组
  • LDAPFilter - 使用 LDAP 查询字符串来过滤组对象
  • SearchBase - 指定要在其中搜索的 Active Directory 路径 (OU)
  • 搜索范围 - 指定您要搜索的深度(基本级别、一级或完整子树)

获取组的最常见方法是使用identity 参数。但为此,您需要知道该组的名称。它将返回具有最重要属性的单个组:

Get-ADGroup -identity SG_M365_E5

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

如您所见,仅从组中返回基本属性。我们可以使用 -properties 参数来检索该组的所有属性。稍后我将详细解释如何检索不同的属性,但如果您想查看组中的所有信息,请使用以下命令:

Get-ADGroup -identity SG_M365_E5 -properties *

使用过滤器参数

当您搜索特定组并且不知道确切名称时,可以使用过滤器参数。这使我们能够根据名称或其他属性的一部分搜索所有组。

筛选器参数还可用于从 Active Directory 检索多个组或所有组。

让我们看一下几个常用的查找组的示例:

要根据名称的一部分查找组,您可以使用 -like 过滤器:

Get-ADGroup -Filter "Name -like 'SG_*'" | ft

这将返回名称以 SG_ 开头的所有组。

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

要获取所有安全组,我们可以根据组类别值过滤组:

Get-ADGroup -Filter "GroupCategory -eq 'Security'" | ft

如果运行上面的命令,您会注意到它还返回所有内置组。大多数时候,您的导出中不需要这些。那么让我们过滤掉它们:

Get-ADGroup -Filter "GroupCategory -eq 'Security' -and GroupScope -ne 'Domainlocal'" | ft

现在您仍然剩下一些内置组。这些组位于 Active Directory 中的默认用户 OU 容器中。还有两个选项可以过滤掉这些内容,您可以指定搜索库,请参阅下一章,或者过滤掉 DistinguishedNameOU=Users,DC= 结尾的所有结果域,DC=本地。

# Replace DC=Domain,DC=Local with your AD domain name
Get-ADGroup -Filter "GroupCategory -eq 'Security' -and GroupScope -ne 'Domainlocal'" |  Where-Object { $_.DistinguishedName -notlike "*,CN=user,DC=Domain,DC=local" } | ft

您还可以使用以下 cmdlet 获取域的 DN 路径:

Get-ADDomain | Select -ExpandProperty DistinguishedName

获取 ADGroup 搜索库

当您想要从 Active Directory 检索多个组时,您可能需要缩小搜索范围。如上一章所述,当您列出所有组时,也会列出所有内置组。大多数情况下,您的群组都组织在单独的组织单位中,因此我们可以使用 SearchBase (distinguishedName) 参数来指定要搜索的组织单位。

DistinguishedName 是 OU 的完整路径,我们将其从 OU 沿树向上写入 AD 域名。

采用以下 AD 结构,我们希望获取阿姆斯特丹站点的所有计算机:

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

在这种情况下,搜索基础字符串将是:

    1              2           3         4        5
"OU=Computers,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL"

例如,要获取 OU 阿姆斯特丹的所有组,我们可以使用以下 SearchBase 路径:

Get-ADGroup -Filter * -SearchBase "OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL" | ft

使用搜索范围

-SearchBase 参数将返回指定和嵌套 OU 中的所有计算机。通过使用 -SearchScope 参数,我们可以指定要在 Active Directory 树中搜索的深度。

例如,我们想要从阿姆斯特丹站点获取除测试组之外的所有组:

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

要获取阿姆斯特丹的所有组(子 OU“test”中的组除外),我们可以使用 searchScope 参数将 searchBase 限制为仅当前级别:

$searchBase = "OU=Groups,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL"

Get-ADGroup -Filter * -SearchBase $searchBase -SearchScope OneLevel

获取群组经理

Active Directory 组可以由用户管理。通过这种方式,用户可以添加或删除组的成员,这对于通讯组或当组中有许多突变时非常有用。

要获取组的管理者,我们可以使用 Get-ADGroup cmdlet 和属性 managementBy

# You can also use a filter or searchbase to get the manager of multiple groups
Get-ADGroup -Identity management -Properties managedby | select name, managedBy | ft

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

正如您在上面的屏幕截图中看到的,managementBy 属性返回用户的可分辨名称。如果您只需要名称,可以通过管道在其后面输入 Get-ADUser cmdlet:

Get-ADGroup -Identity management -Properties ManagedBy | % {Get-ADUser -Identity $_.managedBy} | select name

获取组的组成员资格

组也可以是其他组的成员,当您想要根据组成员身份分配许可证或其他权限时,这特别有用。例如,所有经理都应该有权访问 PowerBi。现在,您可以将每个管理器单独添加到 SG_M365_PowerBi 组,但您也可以使组管理成为 SG_M365_PowerBi 的成员。

要列出某个组所属的所有组,您可以使用 memberOf 属性:

Get-ADGroup -Identity management -Properties memberOf | select name,memberOf

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

但正如您在上面的屏幕截图中看到的,这并不是一个真正可读的名称。就像组管理器一样,我们需要查找每个组才能获取名称。

幸运的是,还有另一个选项,我们可以使用 Get-ADPrincipalGroupMembership cmdlet 来仅获取组所属的组的名称:

Get-ADPrincipalGroupMembership -identity management | ft

[玩转系统] 如何在 PowerShell 中使用 Get-ADGroup

使用 PowerShell 将所有 AD 组导出到 CSV

如果您想获得 Active Directory 中所有组的概览,那么导出到 CSV 是一个不错的方法。例如,这使您可以浏览 Excel 中的所有组并列出所有组管理员或成员资格。

我已经编写了有关 Export-CSV cmdlet 的完整指南,但我还想为您提供一些使用 Get-ADGroup cmdlet 时有用的示例。

要简单地导出所有 AD Group 对象,我们可以使用以下命令:

Get-ADGroup -filter * | Export-csv c:\temp\adgroups.csv -NoTypeInformation

这将列出所有组,包括仅具有默认属性的内置组。大多数时候并不是您真正需要的信息。

完成将 AD 组导出到 CSV 脚本

我创建了一个 PowerShell 脚本,它将使用最常用的属性将所有 AD 组导出为 CSV。

运行脚本时,您指定几个选项:

  • 指定搜索库(OU),默认整个Active Directory
  • 包含或排除内置组(默认排除)
  • 导出路径CSV文件(默认无,控制台输出)

如果您不指定 searchBase (OU),该脚本将从 Active Directory 获取所有组。也可以指定多个 OU:

.\Get-ADGroups.ps1 -searchBase "OU=groups,OU=Amsterdam,DC=LazyAdmin,DC=Local","OU=groups,OU=Oslo,DC=LazyAdmin,DC=Local" -csvpath c:\temp\computers.csv

请按照以下步骤使用 PowerShell 脚本导出 AD 组:

  1. 从我的 Github 下载完整的导出 AD 组脚本
  2. 打开 PowerShell 并导航到脚本
  3. 运行导出脚本:Get-ADGroups.ps1

完成后,脚本将自动为您打开 Excel。

param(
  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter the searchbase between quotes or multiple separated with a comma"
    )]
  [string[]]$searchBase,

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Include built-in groups or exclude"
  )]
  [ValidateSet("include", "exclude")]
  [string]$builtin = "exclude",

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter path to save the CSV file"
  )]
  [string]$CSVpath
)

Function Get-Groups{
    <#
    .SYNOPSIS
      Get groups from the requested DN
    #>
    param(
      [Parameter(
        Mandatory = $true
      )]
      $dn
    )
    process{
      # Set the properties to retrieve
      $properties = @(
        'Name',
        'CanonicalName',
        'GroupCategory',
        'GroupScope',
        'ManagedBy',
        'MemberOf',
        'created',
        'whenChanged',
        'mail',
        'info',
        'description'
      )

      
      # Get all groups, or exclude the builtin groups
      # Get the computers
      switch ($builtin)
      {
        "include" {
          Get-ADGroup -filter * -searchBase $dn -Properties $properties | select $properties
        }
        "exclude" {
          $builtinUsers = "CN=users,$dn" 
          $filter = "GroupScope -ne 'Domainlocal'"
          Get-ADGroup -filter $filter -searchBase $dn -Properties $properties |  Where-Object { $_.DistinguishedName -notlike "*,$builtinUsers" } | select $properties
        }
      }
    }
}

Function Get-ADGroups {
  <#
    .SYNOPSIS
      Get all AD Groups
  #>
  process {
    Write-Host "Collecting groups" -ForegroundColor Cyan
    $groups = @()

    # Collect groups
    if ($searchBase) {
      # Get the requested groups
       foreach ($dn in $searchBase) {
         Write-Host "- Get groups in $dn" -ForegroundColor Cyan
         $groups += Get-Groups -dn $dn
       }
     }else{
       # Get distinguishedName of the domain
       $dn = Get-ADDomain | Select -ExpandProperty DistinguishedName
       Write-Host "- Get groups in $dn" -ForegroundColor Cyan
       $groups += Get-Groups -dn $dn
     }
 

    # Loop through all computers
    $groups | ForEach {
      $managedBy = ''
      $memberOf = ''

      # If the group is managed, get the users name
      if ($null -ne $_.ManagedBy) {
        $managedBy = Get-ADUser -Identity $_.ManagedBy | select -ExpandProperty name
      }

      # If the group is member of other groups, get the group names
      if ($_.MemberOf.count -gt 0) {
        $memberOf = Get-ADPrincipalGroupMembership $_.name | select -ExpandProperty name
      }

      [pscustomobject]@{
        "Name" = $_.Name
        "CanonicalName" = $_.CanonicalName
        "GroupCategory" = $_.GroupCategory
        "GroupScope" = $_.GroupScope
        "Mail" = $_.Mail
        "Description" = $_.Description
        "Info" = $_.info
        "ManagedBy" = $managedBy
        "MemberOf" = ($memberOf | out-string).Trim()
        "Date created" = $_.created
        "Date changed" = $_.whenChanged
      }
    }
  }
}

If ($CSVpath) {
  # Get mailbox status
  Get-ADGroups | Export-CSV -Path $CSVpath -NoTypeInformation -Encoding UTF8
  if ((Get-Item $CSVpath).Length -gt 0) {
      Write-Host "Report finished and saved in $CSVpath" -ForegroundColor Green
      Invoke-Item $CSVpath
  } 
  else {
      Write-Host "Failed to create report" -ForegroundColor Red
  }
}
Else {
  Get-ADGroups
}

总结

当您需要从 Active Directory 获取所有组时,Get-ADGroup cmdlet 非常有用。借助过滤器和/或搜索库参数,您可以快速仅选择您需要的组。

如果您有任何疑问,请在下面发表评论。

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

取消回复欢迎 发表评论:

关灯