如何使用 PowerShell 报告 Active Directory 模式更改

对Active Directory(AD)模式的更改可能导致运行问题。一般来说,模式不应更改。但如果安装了依赖于Active Directory的新应用程序,如Microsoft Exchange Server,那么必须更新模式以支持该应用程序。为了保护AD的完整性,最好检查只有经批准的模式更改才能进行。

使用PowerShell可以轻松生成AD模式更改报告。但在运行本文中的代码之前,请安装用于Windows Server Active Directory的PowerShell模块。Active Directory PowerShell模块默认安装在域控制器(DC)上。但最佳做法是从加入域的Windows 10 PC执行日常管理任务。

广告

安装Windows Server Active Directory PowerShell模块

AD PowerShell模块是Active Directory域服务的远程服务器管理工具(RSAT)的一部分。要安装RSAT AD工具,请使用本地管理员特权打开PowerShell提示符,并运行以下命令:

Add-WindowsCapability -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 –Online

安装完工具后,可以关闭提升的PowerShell窗口。要运行本文中其余的命令,您只需使用隶属于Active Directory“域用户”组的帐户登录到Windows 10。

有关在Windows 10中安装RSAT的更多信息,请参阅Petri上的如何在Windows 10中安装远程服务器管理工具

使用PowerShell报告AD架构更改

通过使用Get-ADObject cmdlet,我们可以显示架构更改。但是首先我们需要为Get-ADObject提供一个搜索基,或者换句话说,一个要搜索的目录区域。我们想要搜索架构,所以我们需要知道我们目录的架构命名上下文。幸运的是,使用Get-ADRootDSE cmdlet很容易检索到这一点。如果你运行Get-ADRootDSE而不带任何参数,你将在输出中看到目录的schemaNamingContext的路径。

广告

Image # Expand
How to Report Active Directory Schema Changes Using PowerShell (Image Credit: Russell Smith)

 

PowerShell使得提取任何属性变得容易,比如schemaNamingContext,通过使用点和括号,如下所示:

((Get-ADRootDSE).schemanamingcontext)

我们可以使用上面的代码作为Get-ADObject cmdlet的-SearchBase参数的值。但是还有其他几个参数我们需要添加。-SearchScope应该设置为OneLevel,它搜索在-SearchBase参数中提供的路径的直接子对象。-Filter参数的值使用通配符*来返回所有内容。

最后,我们使用-Properties参数来指定我们希望作为输出的一部分返回的属性。如你所见,我将提取objectClass, name, whenChanged,whenCreated属性。

广告

$schema = Get-ADObject -SearchBase ((Get-ADRootDSE).schemanamingcontext)-SearchScope OneLevel -Filter * -Properties objectClass, name, whenChanged, whenCreated

我们希望按日期对返回的数据进行分组。为此,我们需要whencreated日期,但不包含时间信息。我们可以使用Select-Object cmdlet和一个计算的属性来创建一个新的对象,其中包含我们需要的以正确格式显示的数据。在下面的扩展命令中,您可以看到我已经将由Get-ADObject生成的对象传送到Select-Object cmdlet。@表示一个计算的属性,它有一个标签“Event”,以及一个表达式,该表达式仅从whenCreated属性中返回日期的缩写形式。

$schema = Get-ADObject -SearchBase ((Get-ADRootDSE).schemaNamingContext)-SearchScope OneLevel -Filter * -Properties objectClass, name, whenChanged, whenCreated | Select-Object objectClass, name, whenChanged, whenCreated, @{name='Event';expression={($_.whenCreated).Date.ToShortDateString()}}

接下来,我们将把Select-Object创建的对象传送到Sort-Object。并让它按whenCreated属性对对象数据进行排序。

$schema = Get-ADObject -SearchBase ((Get-ADRootDSE).schemaNamingContext)-SearchScope OneLevel -Filter * -Properties objectClass, name, whenChanged, whenCreated | Select-Object objectClass, name, whenChanged, whenCreated, @{name='Event';expression={($_.whenCreated).Date.ToShortDateString()}} | Sort-Object -Property whenCreated

最后,让我们把对象传送到Format-Table cmdlet。它将以表格形式显示属性,按我们使用Select-Object cmdlet创建的Event分组。

$schema | Format-Table objectClass, name, whenChanged, whenCreated -groupby Event -autosize
Image # Expand
How to Report Active Directory Schema Changes Using PowerShell (Image Credit: Russell Smith)
$schema = Get-ADObject -SearchBase ((Get-ADRootDSE).schemaNamingContext)-SearchScope OneLevel -Filter * -Properties objectClass, name, whenChanged, whenCreated | Select-Object objectClass, name, whenChanged, whenCreated, @{name='Event';expression={($_.whenCreated).Date.ToShortDateString()}} | Sort-Object -Property whenCreated

$schema | Format-Table objectClass, name, whenChanged, whenCreated -groupby Event -autosize

如果我们将所有代码一起运行,我们将在命令提示窗口中看到架构更改列表。在我的目录中,安装了Exchange服务器,因此我们可以看到架构发生了许多变化。

 

Source:
https://petri.com/how-to-report-active-directory-schema-changes-using-powershell/