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

[玩转系统] Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户

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

Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户


Active Directory 是我们管理用户帐户的主要来源。管理控制台非常适合查找单个用户,但当我们需要更多用户时,PowerShell 中的 Get-ADUser cmdlet 功能更强大。

它使我们能够快速获取用户选择或从单个或多个用户获取详细信息。这也是将用户帐户或信息导出到 CSV 文件的好方法。

在本文中,我们将了解 PowerShell 中的 get aduser cmdlet。另外,我将为您提供一些有关查找和导出广告用户的有用示例。作为奖励,如果添加了完整的脚本来导出您的 AD 用户。

安装活动目录模块

为了能够在 PowerShell 中使用 Get-ADuser cmdlet,您需要安装 Active Directory 模块。默认情况下,它安装在域控制器上,但在 Windows 10 或 11 上,您将需要安装它。

您可以在 Windows 10 或 11 中运行以下 PowerShell 命令来安装该模块:

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

在 PowerShell 中使用 Get ADUser 查找用户

Get-ADUser cmdlet 允许我们在 Active Directory 中查找用户帐户并从中提取信息。此 cmdlet 的真正强大之处在于它提供了不同的选项来查找这些用户帐户。

在寻找帐户时,我们有以下选择:

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

Identity 参数主要在您知道用户的SAMAccountName(登录名)时使用。这允许您从 Active Directory 中选择单个用户并查看该帐户的属性。

Get-ADUser -identity arhodes

[玩转系统] Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户

正如您所看到的,用户返回了一些基本属性。我们可以使用 -properties 参数从用户检索更多信息。稍后我将详细解释如何检索不同的属性,但如果您想查看用户帐户的所有可能信息,请使用以下命令:

Get-ADUser -identity arhodes -Propeties *

使用过滤器

在 Active Directory 中查找用户的更常见方法是使用 -filter 参数。过滤器参数使用PowerShell表达式语言过滤结果。这意味着我们可以在查询中使用以下运算符:

-eq

等于

-le

小于或等于

-ge

大于或等于

-ne

不等于

-lt

少于然后

-gt

更伟大的是

-like

喜欢

-notlike

不喜欢

-and -or

和/或

-not

不是

因此,让我们看一下过滤 Active Directory 用户时的几个常用示例。

要按名字或姓氏查找用户,我们可以使用以下过滤器

# Search on first name
Get-ADUser -Filter "GivenName -eq 'Alan'"

# Search on last name:
Get-ADUser -Filter "Surname -eq 'Rhodes'"

另一种选择是将 like 运算符与通配符结合使用。当您知道名称的一部分时,这特别有用。请注意表示通配符的 * 符号。

Get-ADUser -Filter "name -like '*rho*'"

例如,-ge-le 可用于根据失败的登录尝试查找所有用户:

# Find all users that have more then 3 failed login attempts
Get-ADUser -Filter "badpwdcount -ge 3"

要查找特定字段未填写的所有用户,我们可以使用 -notlike 运算符。例如,我们想要检索所有未填写电子邮件地址字段的用户。

-notlike 过滤器与通配符结合使用,我们可以搜索电子邮件字段中没有任何数据的所有用户。

Get-ADUser -Filter "Email -notlike '*'" | ft

您可以轻松地将其与 Set-ADUser cmdlet 结合使用,以使用单个命令更新大量用户。例如我们获取所有没有填写网页属性的用户,并将其设置为公司网站:

Get-ADUser -Filter "homepage -notlike '*'" | Set-ADUser -HomePage "a-d.site"

组合过滤器

我们还可以使用多个表达式来扩展过滤器查询。这使您可以进一步缩小过滤器查询的范围。例如,我们想要找到所有担任“客户经理”的员工。

如果我们使用以下过滤器,那么它将返回具有职位帐户经理的所有用户:

Get-ADUser -Filter "title -eq 'account manager'" | Select Name,Enabled | ft

但问题是,这也包括被禁用的帐户。我们只想要活跃用户,我们对已经离开公司的用户不感兴趣。因此,我们还可以过滤已启用的帐户:

Get-ADUser -Filter "title -eq 'account manager' -and enabled -like 'true'" | Select Name,Enabled | ft

[玩转系统] Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户

我想与您分享的最后一个过滤器示例是根据日期字段获取用户。假设我们想要找到所有不活动的帐户。

为此,我们可以使用 Active Directory 中的 lastlogon 字段。我们首先需要创建一个日期变量,获取今天的日期并从中减去 30 天。

然后我们可以获取过去 30 天内未登录该域的所有用户:

$date = (Get-Date) - (New-TimeSpan -Days 30)
Get-ADUser -Filter 'lastLogon -lt $date' | ft

获取 ADUser 搜索库

当您的 Active Directory 中有很多用户时,您可能需要缩小搜索范围。为此,我们可以使用 Get-ADUser cmdlet 的 -SearchBase 参数。这允许我们指定要搜索的distinguishedName(OU 级别)。

要指定我们要搜索的 OU,我们需要从下往上写入 DistinguishedName。因此,该字符串以要搜索的 OU 开头,以域名结尾。

采用以下 Active Directory 结构,我们希望获取 IT OU 中的所有用户:

[玩转系统] Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户

在本例中,SearchBase 字符串为:

1: IT
2: Amsterdam
3: Sites
4: Lazyadmin
5: NL

"OU=IT,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL"

因此,要获取阿姆斯特丹 IT 部门的所有用户,我们可以使用以下 PowerShell 命令:

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

使用搜索范围

默认情况下,-SearchBase 参数将返回指定 OU 和嵌套 OU 中的所有用户。使用 -SearchScope 参数,我们可以指定要在 Active Directory 树中搜索的深度。

假设我们需要来自阿姆斯特丹 OU 的用户,而不是来自嵌套 OU 的用户。

[玩转系统] Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户

如果我们使用以下 SearchBase,则返回所有用户,包括来自 IT、营销和生产 OU 的用户:

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

为了仅获取阿姆斯特丹 OU 中的用户,我们可以使用 SearchScope 参数。这允许我们将 SearchBase 限制为仅当前级别:

Get-ADUser -Filter * -SearchBase "OU=IT,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL" -SearchScope OneLevel | ft

[玩转系统] Get-ADUser - 如何使用 PowerShell 查找和导出 AD 用户

获取 ADUser 属性

使用 Get ADUser cmdlet 时,您可能已经注意到它只会返回用户帐户的几个属性。但您可能知道,用户帐户具有更多属性。

要返回所有属性,我们需要将 -properties 参数添加到 cmdlet:

Get-ADUser -identity arhodes -properties *

这将返回一个长列表,其中包含用户帐户的所有可能属性。现在,这可能是太多信息,因此您可能需要指定您需要的实际字段。

为此,您需要在其后面传递 select 命令,我们在其中指定所需的字段。在属性参数中指定相同的字段,而不是请求所有数据也是一个好主意。

例如,如果您想要全名、职位和电子邮件地址,那么您可以使用以下命令:

Get-ADUser -identity arhodes -properties emailaddress,title | select name,emailaddress,title

选择不同的值

下一个技巧与 Get ADUser cmdlet 并不真正相关,但我经常将其与从 Active Directory 中获取用户信息结合使用。

当您想要导出 Active Directory 中所有可能职位的列表时,可以在 PowerShell 中使用 -Unique 参数。

Get-ADUser -Filter * -Properties title | Select title -Unique

此命令将为您提供您在 Active Directory 中使用过的所有职位。

使用 PowerShell 将 AD 用户导出到 CSV

将 PowerShell 中的结果导出为 CSV 非常常见。我们都经常使用 PowerShell 来检索信息,只是为了在 Excel 中进一步处理它。我已经编写了有关 Export-CSV cmdlet 的完整指南,但我还想为您提供一些使用 Get-ADUser cmdlet 时有用的示例。

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

Get-ADUser -filter * | Export-CSV c:\temp\users.csv -NoTypeInformation

但正如您会注意到的那样,这并不会真正给出您正在寻找的结果。它将包括所有用户帐户(启用和禁用),而不是我们真正需要的信息。

导出额外字段

所以第一步是指定我们真正想要导出的字段。例如,如果我们想导出姓名、职位、部门和电子邮件地址,我们可以使用以下命令:

Get-ADUser -filter * -properties mail,title,department | select name,title,department,mail | Export-CSV c:\temp\users.csv -NoTypeInformation

仅导出启用的用户

要仅将活动(已启用)用户从 AD 导出到 CSV 文件,我们可以在 PowerShell 中使用以下命令:

# Export all enabled users
Get-ADUser -Filter "Enabled -like 'true'" | Export-CSV c:\temp\users.csv -NoTypeInformation

# OR Export only disabled users
Get-ADUser -Filter "Enabled -like 'False'" | Export-CSV c:\temp\users.csv -NoTypeInformation

完成将 AD 用户导出到 CSV 脚本

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

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

  • 是否获取经理的显示名称(默认 true)
  • 指定搜索库(OU),默认整个Active Directory
  • 获取启用或禁用的帐户或两者(仅默认启用)
  • 导出路径 CSV 文件(默认脚本位置)

如果您不指定 searchBase (OU),该脚本将从活动目录中获取所有用户帐户。也可以指定多个 OU:

.\Get-ADusers.ps1 -searchBase "OU=users,OU=Amsterdam,DC=LazyAdmin,DC=Local","OU=users,OU=Oslo,DC=LazyAdmin,DC=Local" -path c:\temp\users.csv

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

  1. 从我的 Github 下载完整的导出 AD 用户脚本
  2. 打开 PowerShell 并导航到脚本
  3. 运行导出脚本:Get-ADUsers.ps1 -csvpath c:\temp\adusers.csv

完成后,脚本将自动为您打开 Excel。您还可以运行不带 csvpath 参数的脚本,将结果输出到控制台。

param(
  [Parameter(
    Mandatory = $false,
    HelpMessage = "Get the users manager"
  )]
  [switch]$getManager = $true,

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

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Get accounts that are enabled, disabled or both"
  )]
    [ValidateSet("true", "false", "both")]
  [string]$enabled = "true",

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

Function Get-Users {
    <#
    .SYNOPSIS
      Get users from the requested DN
    #>
    param(
      [Parameter(
        Mandatory = $true
      )]
      $dn
    )
    process{
      # Set the properties to retrieve
      $properties = @(
        'name',
        'userprincipalname',
        'mail',
        'title',
        'enabled',
        'manager',
        'department',
        'telephoneNumber',
        'office',
        'mobile',
        'streetAddress',
        'city',
        'postalcode',
        'state',
        'country',
        'description',
        'lastlogondate'
      )

      # Get enabled, disabled or both users
      switch ($enabled)
      {
        "true" {$filter = "enabled -eq 'true'"}
        "false" {$filter = "enabled -eq 'false'"}
        "both" {$filter = "*"}
      }

      # Get the users
      Get-ADUser -Filter $filter -Properties $properties -SearchBase $dn | select $properties
    }
}


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

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

    $users | ForEach {

      $manager = ""

      If (($getManager.IsPresent) -and ($_.manager)) {
        # Get the users' manager
        $manager = Get-ADUser -Identity $_.manager | Select -ExpandProperty Name
      }

      [pscustomobject]@{
        "Name" = $_.Name
        "UserPrincipalName" = $_.UserPrincipalName
        "Emailaddress" = $_.mail
        "Job title" = $_.Title
        "Manager" = $manager
        "Department" = $_.Department
        "Office" = $_.Office
        "Phone" = $_.telephoneNumber
        "Mobile" = $_.mobile
        "Enabled" = $_.enabled
        "Street" = $_.StreetAddress
        "City" = $_.City
        "Postal code" = $_.PostalCode
        "State" = $_.State
        "Country" = $_.Country
        "Description" = $_.Description
        "Last login" = $_.lastlogondate
      }
    }
  }
}

If ($CSVpath) {
  # Get mailbox status
  Get-AllADUsers | Sort-Object Name | Export-CSV -Path $CSVpath -NoTypeInformation -Encoding UTF8
  if ((Get-Item $CSVpath).Length -gt 0) {
      Write-Host "Report finished and saved in $CSVpath" -ForegroundColor Green

      # Open the CSV file
      Invoke-Item $path
  } 
  else {
      Write-Host "Failed to create report" -ForegroundColor Red
  }
}
Else {
  Get-AllADUsers | Sort-Object Name 
}

总结

当需要从 Active Directory 中获取信息时,Get ADUser cmdlet 非常有用。使用不同的过滤器可以让您仅检索真正需要的信息。

要将 AD 用户导出到 CSV,您可以尝试该脚本。您可以根据自己的需要轻松更改它检索的属性。

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

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

取消回复欢迎 发表评论:

关灯