使用 PowerShell 创建活动目录 OU 报告

使用PowerShell创建Active Directory OU报告。组织单位(OU)是一个Active Directory(AD)容器,用户、组、计算机和其他OU可以存储在其中。每个AD域都可以有其组织单位层次结构。本文将涵盖OU管理以及如何使用Windows PowerShell脚本在AD中移动、创建、删除和生成OU报告,并将组策略链接和强制执行到OU。

还阅读 如何安装Active Directory PowerShell模块和导入

使用PowerShell创建Active Directory OU报告

前提条件如果我们想要跟随本文中的示例脚本进行操作,我们需要安装所需的组件:

如果我们想按照本文中的示例脚本进行操作,我们需要安装预要求的组件:

那么,如何使用PowerShell创建Active Directory OU报告呢?让我们一起探索。

理解组织单位命令

A Microsoft Active Directory domain container that can hold users, groups, and computers is an organizational unit (OU). It is the smallest unit to which a Windows system administrator can assign a Group Policy setting or account permission. An organizational unit may contain multiple OUs, but each attribute within the containing OU must be distinct.

对象 不能包含来自其他域的 Active Directory 组织单位。以下部分将介绍管理 OU 的基本命令。

使用 PowerShell 在 Active Directory 中创建 OU

我们可以通过使用New-ADOrganizationalUnit命令并在其中指定新OU对象的名称来在AD中创建一个新的组织单位。Windows PowerShell将默认在域根目录中创建组织单位。例如,以下命令将在域控制器(DC)上创建一个名为IT的OU:

New-ADOrganizationalUnit “IT

如果我们需要不同的OU LDAP路径,可以使用-Pathcmdlet参数来指定其可分辨名称(DN):

New-ADOrganizationalUnit “IT” –Path “OU=Users,DC=InfraSOS,DC=com”

使用PowerShell在Active Directory中移动OU

如果我们需要将一个OU移动到另一个位置,请使用Move-ADObject cmdlet。需要注意的是,我们绝不能防止目标OU被意外删除。如果是这样,请使用以下命令移除保护:

Set-ADOrganizationalUnit -Identity "OU=IT,OU=Users,DC=InfraSOS,DC=Com" -ProtectedFromAccidentalDeletion $False

现在我们可以将OU移动到另一个位置:

Move-ADObject -Identity "OU=Regions,OU=Managers,DC=InfraSOS,DC=Com" -TargetPath "OU=IT,DC=InfraSOS,DC=Com"

使用PowerShell在活动目录中重命名OU

使用Rename-ADObject cmdlet来重命名一个组织单元。Identity参数指定了要重命名的AD对象,并需要DN或GUID。例如,以下命令将IT OU的名称更改为Marketing:

Rename-ADObject -Identity "OU=Regions,OU=IT,DC=InfraSOS,DC=COM" -NewName Marketing

我们还可以使用中的 Get-ADOrganizationalUnit cmdlet,并结合-Filter 参数,这样就不需要完整的LDAP路径到OU。然而,该cmdlet将搜索整个AD,并且脚本将对所有在其名称中包含搜索词的组织单位应用命令的操作:

Get-ADOrganizationalUnit -Filter "Name -eq 'Zones'" | Rename-ADObject -NewName Area

一旦我们开始生成报告,我们将更详细地讨论获取OU命令。

使用PowerShell在Active Directory中对OU应用组策略

要将组策略分配给组织单位,我们可以使用New-GPLink命令,该命令将指定的组策略对象(GPO)链接到组织单位。此外,我们可以识别链接的以下任何属性:

  • 启用 – 如果链接具有启用状态,则在站点、域和OU的组策略进行处理时将应用GPO的处理设置。
  • 强制 – 如果链接具有强制状态,则无法在较低级别的容器中阻止OU。
  • 顺序顺序状态指定GPO设置的优先级。

例如,以下命令将 GPO 链接到IT 组织单位,同时启用并强制执行链接:

New-GPLink -Name "Block" -Target "OU=Districts,OU=IT, DC=InfraSOS, DC=com" -LinkEnabled Yes -Enforced Yes

使用PowerShell在AD中将用户和计算机移动到新的OU

在我们创建了一个组织单位并可选地将其链接到GPO之后,我们将用用户和计算机填充它。Move-ADObjectPowerShell中的cmdlet将任何对象或一组活动目录对象移动到不同的OU。身份参数指示应重新定位哪个对象活动目录对象或容器。

需要注意的是,我们必须输入对象的完整LDAP路径或SID;我们不能使用其SamAccountName。以下示例展示了如何将用户移动到IT组织单位(OU):

Move-ADObject -Identity "CN=marion,CN=Users,DC=InfraSOS,DC=com" -TargetPath "OU=IT,OU=Users,DC=InfraSOS,DC=com"

使用完全相同的语法来移动计算机对象。例如,以下命令将计算机DESKTOP-01转移到Computers容器中:

Move-ADObject -Identity "CN=DESKTOP-01,OU=Computers,DC=InfraSOS,DC=com" -TargetPath "CN=Workstations,DC=InfraSOS,DC=com"

批量移动AD计算机和用户到另一个OU

如果我们有一个预定义的对象列表要移动,我们可以将其保存为文本文件,然后导入到Active Directory中。通过在每行添加一个AD对象来准备您的列表。包含列表的文本文件应该看起来像这样:

使用以下PowerShell脚本来移动在文本文件中列出的AD用户账户:

$destOU =  "OU=Users,OU=IT,DC=InfraSOS,DC=com"
$usersList = Get-Content -Path "C:\temp\users.txt"

$usersList  | ForEach-Object {
     $userName  = (Get-ADUser -Identity $_.Name).distinguishedName
     Move-ADObject  -Identity $userName  -TargetPath $destOU
 }

要移动在文本文件中列出的AD计算机账户,请使用以下PowerShell脚本:

$computers = Get-Content -Path "C:\Temp\Computers.txt"

$destOU =  "OU=Computers,OU=IT,DC=InfraSOS,DC=com"
ForEach( $computer in $computers){
    Get-ADComputer $computer |
    Move-ADObject -TargetPath $destOU
}

使用PowerShell从Active Directory中删除OU

The Remove-ADOrganizationalUnit cmdlet可以删除一个OU。但是,我们不能防止OU被意外删除。使用Get-ADOrganizationalUnit 和 Set-ADOrganizationalUnit cmdlets,我们可以为名称中包含Zones的每个OU移除意外删除选项:

Get-ADOrganizationalUnit -filter "Name -eq 'Zones'" | Set-ADOrganizationalUnit  -ProtectedFromAccidentalDeletion $False

使用以下cmdlet从AD中删除名称中包含Zones的每个OU:

Get-ADOrganizationalUnit -filter "Name -eq 'Zones'" | Remove-ADOrganizationalUnit –Recursive

系统将提示我们确认删除:

请注意,-Recursive 参数会删除OU及其所有子对象。即使子对象的保护删除功能已开启,AD也会删除这些子对象。

管理AD中的组织单位

在讨论了涉及组织单位的基本命令和参数之后,我们将进一步讨论如何使用PowerShell生成OU报告

使用PowerShell获取所有OU的列表

我们将使用Get-ADOrganizationalUnitcmdlet。首先,按规范名称排序。这个命令显示了一个更容易阅读的OU结构。

Get-ADOrganizationalUnit -Properties CanonicalName -Filter * |
Sort-Object CanonicalName |
Format-Table CanonicalName, DistinguishedName

以下是我们在PowerShell中运行命令时的示例输出

包含AD中所有OU的输出是一个很好的列表。但我们如何知道OU是否包含任何用户

使用PowerShell获取所有OU列表,包括用户计数

我们喜欢使用PowerShell来获取OU列表,包括用户计数。这个命令将告诉我们OU中是否有任何用户。

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
    }
}

它将显示具有用户计数列属性的输出。如果用户计数属性值为,则OU中没有用户。如果OU包含计算机对象,则不会出现。此命令将仅检查并显示用户计数。

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

既然我们已经看到了OU的列表,现在我们想要导出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

运行上述命令后,在指定的位置找到导出的文件。

感谢阅读使用PowerShell创建Active Directory OU报告。我们将在此结束。

使用PowerShell创建Active Directory OU报告的结论

现在我们已经学会了如何使用PowerShell脚本管理Active Directory中的OU,我们可以自动化与OU管理相关的各种操作,并相应生成报告。在尝试这些命令之前,请确保启用了Active Directory回收站功能,以便轻松回滚任何错误的删除。还要注意仔细跟踪组织单位的所有更改。

请在我们的博客这里查看我们的PowerShell内容。

Source:
https://infrasos.com/create-active-directory-ou-reports-with-powershell/