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

[玩转系统] 使用 PowerShell 获取组织单位

作者:精品下载站 日期:2024-12-14 18:11:50 浏览:13 分类:玩电脑

使用 PowerShell 获取组织单位


我们希望获取 Active Directory 中所有组织单位 (OU) 的列表,并使用 PowerShell 将其导出。为什么我们需要那个?我们喜欢清理未使用的 OU。本文将教您如何使用 PowerShell 显示和导出组织单位列表。

使用 PowerShell 获取所有组织单位的列表

以管理员身份运行 PowerShell。获取 Active Directory 中所有 OU 的列表。我们将使用 Get-ADOrganizationalUnit cmdlet。让我们对 CanonicalName 进行排序。这将向我们展示 OU 分解结构并且更易于阅读。

PS C:\> Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Sort-Object CanonicalName | Format-Table CanonicalName, DistinguishedName

CanonicalName                                      DistinguishedName                                          
-------------                                      -----------------                                          
a-d.local/AT Company                         OU=AT Company,DC=a-d,DC=local                        
a-d.local/AT Company/Groups                  OU=Groups,OU=AT Company,DC=a-d,DC=local              
a-d.local/AT Company/Servers                 OU=Servers,OU=AT Company,DC=a-d,DC=local             
a-d.local/AT Company/Servers/Exchange        OU=Exchange,OU=Servers,OU=AT Company,DC=a-d,DC=local 
a-d.local/AT Company/Users                   OU=Users,OU=AT Company,DC=a-d,DC=local               
a-d.local/AT Company/Users/HR                OU=HR,OU=Users,OU=AT Company,DC=a-d,DC=local         
a-d.local/AT Company/Users/IT                OU=IT,OU=Users,OU=AT Company,DC=a-d,DC=local         
a-d.local/Domain Controllers                 OU=Domain Controllers,DC=a-d,DC=local                
a-d.local/Microsoft Exchange Security Groups OU=Microsoft Exchange Security Groups,DC=a-d,DC=local

AD 中所有 OU 的输出是一个很好的列表。但是我们如何知道 OU 中是否存在用户呢?

使用 PowerShell 获取所有组织单位的列表,包括 UserCount

我们希望获取 OU 列表,包括使用 PowerShell 的用户计数。这将向我们显示 OU 中是否存在用户。将以下代码复制并粘贴到 PowerShell ISE 中。

Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Sort-Object CanonicalName |
ForEach-Object {
    [pscustomobject]@{
        Name          = Split-Path $_.CanonicalName -Leaf
        CanonicalName = $_.CanonicalName
        UserCount     = @(Get-AdUser -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    }
}

它将显示带有UserCount列的输出。如果 UserCount 值显示0,则表示 OU 中没有用户。

注意:不会显示 OU 中是否存在计算机对象。这只会检查并显示用户计数。

Name                               CanonicalName                                      UserCount
----                               -------------                                      ---------
AT Company                         a-d.local/AT Company                                 0
Groups                             a-d.local/AT Company/Groups                          0
Servers                            a-d.local/AT Company/Servers                         0
Exchange                           a-d.local/AT Company/Servers/Exchange                0
Users                              a-d.local/AT Company/Users                           0
HR                                 a-d.local/AT Company/Users/HR                        5
IT                                 a-d.local/AT Company/Users/IT                       15
Domain Controllers                 a-d.local/Domain Controllers                         0
Microsoft Exchange Security Groups a-d.local/Microsoft Exchange Security Groups         0

使用 PowerShell 获取所有组织单位(包括 ComputerCount)的列表

我们希望获取 OU 列表,包括使用 PowerShell 的计算机数量。

Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Sort-Object CanonicalName |
ForEach-Object {
    [pscustomobject]@{
        Name          = Split-Path $_.CanonicalName -Leaf
        CanonicalName = $_.CanonicalName
        UserCount     = @(Get-AdUser -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
        ComputerCount = @(Get-AdComputer -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    }
}

输出将显示一列ComputerCount

Name                               CanonicalName                                      UserCount ComputerCount
----                               -------------                                      --------- -------------
AT Company                         a-d.local/AT Company                                 0             0
Groups                             a-d.local/AT Company/Groups                          0             0
Servers                            a-d.local/AT Company/Servers                         0             3
Exchange                           a-d.local/AT Company/Servers/Exchange                0             2
Users                              a-d.local/AT Company/Users                           0             0
HR                                 a-d.local/AT Company/Users/HR                        5             0
IT                                 a-d.local/AT Company/Users/IT                       15             0
Domain Controllers                 a-d.local/Domain Controllers                         0             2
Microsoft Exchange Security Groups a-d.local/Microsoft Exchange Security Groups         0             0

使用 PowerShell 获取所有空组织单位的列表

这将显示所有空 OU,除了 Name 和 CanonicalName 之外没有其他输出。

Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Sort-Object CanonicalName |
ForEach-Object {
    $userCount = @(Get-AdUser -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    $computerCount = @(Get-AdComputer -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    $groupCount = @(Get-AdGroup -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    $contactCount = @(Get-ADObject -Filter 'objectClass -eq "contact"' -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count

    if ($userCount -eq 0 -and $computerCount -eq 0 -and $groupCount -eq 0 -and $contactCount -eq 0) {
        [pscustomobject]@{
            Name          = Split-Path $_.CanonicalName -Leaf
            CanonicalName = $_.CanonicalName
        }
    }
}

使用 PowerShell 将 AD 中的 OU 导出到文本文件或 CSV 文件

现在我们已经显示了 AD 中的 OU 列表,我们希望将其导出到文件中。该脚本将使用 PowerShell 获取组织单位并将其导出到文本文件。

$results = Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Sort-Object CanonicalName |
ForEach-Object {
    [pscustomobject]@{
        Name          = Split-Path $_.CanonicalName -Leaf
        CanonicalName = $_.CanonicalName
        UserCount     = @(Get-AdUser -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel).Count
    }
}
$results | Out-File "C:\export_OUs.txt" -Encoding UTF8

如果您想导出到 CSV 文件,请将最后一行更改为:

$results | Export-Csv -Path "C:\export_OUs.csv" -NoTypeInformation -Encoding UTF8

运行上述命令后,在C:\盘中找到导出的文件。我打开了文本文件export_OUs.txt。

[玩转系统] 使用 PowerShell 获取组织单位

就是这样!

了解更多:使用 PowerShell 将 AD 用户批量移动到另一个 OU »

结论

您学习了如何使用 PowerShell 获取组织单位。您还学习了如何查找空 OU。截至最后,您学习了如何使用 PowerShell 将 OU 导出到文本文件或 CSV 文件。

您喜欢这篇文章吗?您可能喜欢使用 PowerShell 将 AD 用户导出为 CSV。不要忘记关注我们并分享这篇文章。

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

取消回复欢迎 发表评论:

关灯