大家好,今天要为大家介绍的是PowerShell AD Module中的最后三个名词:ADObject、ADOptionalFeature和ADRootDSE。虽然名词数量少,但是cmdlets数量却不少,我们可以使用以下命令来看一下一共有多少个cmdlets:
Get-Command *ADObject, *ADOptionalFeature, ADRootDSE | Sort Noun | FT -a
可以看到上述命令供返回11个cmdlets,其中ADObject占了七个。下面我们就先来看看名词部分是ADObject的cmdlets。
相信通过前几次的介绍,各位对如何使用cmdlets来管理活动目录域服务中的用户、组及组织单元都有所了解了。在之前的介绍中涉及到了新建这些对象,为这些对象设置属性值及删除对象这三个操作。但是在实际的管理操作中,还有两个操作也是很常见的,一是移动用户、组及组织单元,二是重命名用户、组及组织单元。但是我们没有看到类似Move-ADUser、Rename-ADGroup的cmdlets,不知道各位在看之前的介绍时有没有产生这样的疑惑?
仔细想一下也不难理解,因为移动和重命名操作不单单只针对一种对象类型,如果单独为每一个对象类型分别加上动词是Move和Rename的cmdlets会有点浪费。同时在活动目录域服务的管理中,虽然系统管理员在用户、组和组织单元上所花的管理时间是最多的,但是有时候也需要管理其它对象,因此PowerShell AD Module的开发团队便设计了ADObject这个名词来代替其它人工管理频率比较低的对象,以便让用户在使用PowerShell进行管理时获得一致的体验。下面就通过创建子网对象这个具体的例子来看一下如何使用名词部分是ADObject的cmdlets。
毫无疑问创建子网对象使用的cmdlet是New-ADObject,在使用New-ADObject时必需要指定对象的名称和类型,而子网对象的类型名称(架构类的LDAP显示名称)是subnet,我们可以使用“Active Directory 架构”来确定。
虽然可以使用New-ADObject来创建架构类中所定义的任意对象,但是使用的前提也很明确,你必须理解每个类的用法和必要属性,这对很多系统管理员来说可能会有点困难,因此这里选择的是子网这个对象,因为子网对系统管理员来说还算是比较面熟的对象。创建子网对象的代码如下:
New-ADObject -Name "192.168.100.0/24" -Description "Shanghai" `
-Type "subnet" -Path "CN=Subnets,CN=Sites,CN=Configuration,DC=Test,DC=Com" `
-OtherAttributes @{siteObject="CN=Shanghai,CN=Sites,CN=Configuration,DC=Test,DC=Com"} `
-Verbose
运行效果如下:
这里还需要注意的是如果要让新建的子网对象与站点关联的话必须使用OtherAttributes参数为子网对象设置siteObject属性,而siteObject属性的值则是站点对象的可分辨名称(distinguishedName)。虽然不这么做也能创建出子网对象,但是如果你在图形界面中创建子网对象的话你会发现必须要指定相应的站点,因此在使用New-ADObject创建时,我们应当遵循这一规则。
这里还引出一个问题,就是如何得到站点的可分辨名称。这个问题,我们可以使用Get-ADObject来轻松解决。因为Get-ADObject从cmdlet名称上来看就是得到AD中的对象,那么得到和站点有关的信息自然不在话下。下面我们就来看看如何使用Get-ADObject来得到站点对象,从而得到站点的可分辨名称。
和其它动词是Get的cmdlets一样,Get-ADObject可以使用Filter及LDAPFilter来获得对象,这里我们使用LDAPFilter参数来得到站点对象,具体命令如下:
Get-ADObject -Filter "(objectCategory -eq 'site') -and (name -eq 'Shanghai')" `
-SearchBase "CN=Configuration,DC=nwtrader,dc=com" | fl *
命令的执行效果如下:
这里除了注意Filter参数的值要设置正确之外,还需要设置SearchBase参数来指定搜索位置。
接下来我们来看看如何使用Set-ADObject。之前在使用New-ADObject创建子网对象时我说过通过PowerShell创建子网对象时可以不指定关联的站点,不过这不是最佳操作实践,但是万一一不小心建立一个没有和站点关联的子网对象,我们除了删除重建之外,还有没有办法弥补呢?当然,Set-ADObject就能解决,不过我们还是需要使用Get-ADObject来得到对象。具体命令如下:
Get-ADObject -Filter "(objectCategory -eq 'subnet') -and (name -eq '172.16.100.0/24')" `
-SearchBase "CN=Configuration,DC=nwtrader,dc=com" | Set-ADObject `
-Add @{siteObject="CN=Shanghai,CN=Sites,CN=Configuration,DC=nwtrader,DC=com"} -Verbose
命令的执行效果如下:
同样的由于是针对所有对象的操作,因此Set-ADObject使用Add,Replace,Remove参数配合哈希表@{attribute=value}来设置对象的属性。不过Set-ADObject还有一个特别有用的参数是ProtectedFromAccidentalDeletion,相信大家也知道这个参数的作用了,是的,除了组织单元之外,我们能对AD中所有重要的对象,无论是用户,组还是子网对象设置防止意外删除标记,这对AD管理员来说无疑是个好消息。
接下来,我们就来看下ADObject所特有的两个动词Rename和Move。Rename-ADObject可能大家认为不需要多做什么解释,一看便知就是重命名AD对象的。但是需要注意的是,该cmdlet只修改对象的Name属性。如果被修改对象是用户、计算机或者组,该cmdlet将不会修改姓,名,显示名,及sAMAccountName,和图形界面提供给我们的一个统一修改界面相比还是有所不同的。下面我们就来看看Rename-ADObject的示例,并看看是不是只修改了Name属性:
而Move-ADObject的使用也不复杂,我们需要先得到需要移动的对象,然后使用TargetPath参数来指定目标容器,接下来我们就来看看如何将admin001这个用户移动到默认的用户容器中。具体代码如下:
Get-ADUser admin001 | Move-ADObject -TargetPath “cn=users,dc=test,dc=com”
命令的执行效果如下:
刚才提到了防止对外意外删除的参数,这里顺便提一个问题。如果朋友正在尝试从Windows Server 2003 升级到Windows Server 2008 R2,并且已经用过Windows Server 2008 R2活动目录的BPA工具的话,想必可能会为下图的警告感觉到不爽(BPA出来的结果可能绝大部分朋友都希望全绿通过)。
这个问题,我想大家已经有答案了吧?我们可以直接用以下命令来解决:
Get-ADOrganizationalUnit -Filter * | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true
至此,与ADObject搭配的动词就剩Remove和Restore没有介绍了,而Remove-ADObject相信大家不用我介绍也知道怎么使用了。而Restore-ADObject在介绍AD回收站时,将详细介绍,这里就暂且放一下。
接下来我们要介绍的是Get-ADRootDSE。该cmdlet主要用来获得活动目录的相关信息,可以不加参数直接运行,获得的信息如下(截图中只包含部分属性):
在上图中红线划出的两个属性对需要编写在不同域环境中运行同一个脚本的朋友来说很有用,因为之前在Get-ADObject的介绍中,大家已经注意到在搜索某些对象时,我们需要指定SearchBase参数,而这些参数值可能会因为拼写错误而经常写错,因此我们可以使用Get-RootDSE来得到包含这些属性的对象,然后将相关值赋值给变量,这样我们便能重复在命令中使用了。
接下来要为大家介绍的就是在Windows Server 2008 R2中活动目录域服务最新增加的一项功能:AD回收站。毫无疑问AD回收站和防止意外删除选项构成了双保险,使得因为系统管理员误删帐号而造成的意外宕机事件降低了最低限度。下面我们就来看看如何使用AD回收站来还原被意外删除的对象。
使用AD回收站的先决条件是活动目录域服务的林功能级必须是Windows Server 2008 R2,也就是说林中的所有域控制器必须全部是Windows Server 2008 R2,相信等Windows Server 2008 R2大范围部署之后,要达到这个先决条件没什么困难。然后AD回收站功能默认是被禁用的,虽然可以通过多种方法来开启,但相较来说使用PowerShell开启还是很简单的,接下来我们就来看看如何使用名词部分是ADOptionalFeature的cmdlets来管理AD回收站功能。
首先使用的cmdlet是Get-ADOptionalFeature,具体命令如下:
Get-ADOptionalFeature -Filter *
执行结果如下:
大家可以看到从返回的信息中我们可以确定在Windows Server 2008 R2中活动目录域服务只带了AD回收站这一功能。同时我们还可以了解到AD回收站这项功能在启用之后是不能被禁用的(IsDisableable)。这一点,我们可以在下面使用Enable-ADOptionalFeature时得到验证。具体命令如下:
Get-ADOptionalFeature -Filter * | Enable-ADOptionalFeature -Scope ForestOrConfigurationSet -Target test.com
命令执行后,大家便能看到相关警告告知AD回收站功能无法被禁用。
在按回车确认启用AD回收站这项功能之后,我们便能看看如何使用AD回收站来还原被删除的对象了。当然在这之前,可能会有朋友质疑,如果AD回收站功能不能被禁用,那么Disable-ADOptionalFeature cmdlet不是没有任何作用了么?现阶段来说的确是这样,但是将来一旦有新的功能增加进来之后,我们便能使用这个cmdlet了,现阶段我们暂且可以不管这个cmdlet。
接下来我们就来看看如何使用Restore-ADObject来还原被删除的对象。当然没有删除哪来还原,我们首先要做的就是删除一个对象,这可以用动词为Remove的cmdlets来删除对象。现在就让我们先来删除一个用户对象,具体命令如下:
Get-ADUser admin002 | Remove-ADUser
接着我们就需要使用Restore-ADObject来还原被删除的对象了,当然按照一贯的操作原则“得到对象,然后对对象进行操作”,现在要做的就是得到被意外删除的用户对象test。那么自然而然的会想到使用动词是Get的cmdlet,那是不是还是Get-ADUser呢?当然不是,因为被意外删除的对象不一定都是用户对象,而且因为要查找的是被删除的对象,所以我们需要使用Get-ADObject cmdlet并且需要加上参数IncludeDeletedObjects。并且为了精确定位被删除的对象,我们需要使用Filter参数,然后将找到的对象通过管道传递给Restore-ADObject,具体命令如下:
Get-ADObject -Filter {sAMAccountName -eq ‘admin002’} -IncludeDeletedObjects | Restore-ADObject -Verbose
命令的执行结果如下:
大家可以注意下被删除的对象是从哪个位置被还原回到原始配置的。接下来可能还有一个疑问,被删除的对象会保留所有被删除之前的属性么?下面我们就来看看一个用户组被删除然后再被还原后它的组成员会不会发生变化。
具体验证过程如下,首先确认IT组中的成员,然后删除IT这个组,接着使用Get-ADObject从已删除对象容器中找到被删除的IT组,并执行还原操作。最后我们再次确认IT组中的成员是不是依然存在。
最后可能还有一个问题,就是如果用户删除了一个OU,而该OU下又包含很多对象,这时该如何执行还原操作呢?由于活动目录中的对象具有层次结构,想要还原下级子对象就必须先还原该子对象的上一级对象。也就是说如果想要还原一个被删除OU下的用户对象的话,首先必须还原该OU。可能听上去很复杂,不过好在活动目录回收站循序渐进指南附录B中为我们提供了一个样例脚本可以帮助我们还原,大家可以参考下。
至此,PowerShell AD Module中所有的cmdlets都为大家进行了介绍。在下一次的介绍中,我们将仔细看看如何使用Filter参数,敬请期待。