Restore a Deleted Active Directory Object At a Domain Controller running Windows Server 2008 R2

前言:有朋友看了中篇老冯的故事以后给老冯发来反响,"为啥你不用AD的备份做授权还原呀?组关系啊啥的属性都在!何苦还要手动再操作?!".这个老冯也是有一定苦衷的.相信大家也清楚要做AD的授权还原,被操作的域控制器必须保持离线状态(进入目录服务还原模式)且操作期间不能对外提供正常服务.这个重启服务器而且有中断服务时间是要先跟主管申请,说明情况的(不要想拿打了更新补丁糊弄主管,这边都是有严格的指定时间的),要是直接跟他说是因为不小心误删除了上面几个帐号啥的,一顿批评那是少不了的,更何况老冯还得为坐在监控室的那几个小妹还有新来的工程师多想想嘛.出来混大家都不容易...另外还有一个伪科学的因素:搞服务器管理的基本上都有一点不愿意有事没事重启服务器的心结.这点在老冯的单位被印证过多次,XX牌服务器于某次重启后就再没启起来(不知道是不是也属于最近被热炒的"问题服务器门"中的一批次),只得找厂商来修,又耽误N久时间.

所以综上所述,老冯主力介绍的都是不用域控还要离线还要重启的一些方法,请各位多多包涵.

 

接上回...

  在工程师们三天两头的念叨和铺天盖地的微软广告效应下,老冯的单位终于愿意将一些服务器平台升级到Windows Server 2008 啦,还有小部分可以申请升级到R2.不过老板有言在先,如果想要全部都换成Windows Server 2008或者R2,还得工程师们拿出强有力的证据(数据)给他看,到底它们比2003优秀在了哪里?

  However,这可乐坏了公司的"域用总管"---老冯.早就听说Windows Server 2008 R2上对Active Directory这块添加了很多新功能新特性,这下总算有机会部署在生产环境中了.(不会被同行们嘲笑"Out"了...T_T)

  跟主管打好报告,申请到了两套Windows Server 2008 R2 Enterprise,老冯就茶不思饭不想地按照Technet资料库里的各种指南和白皮书一头扎进域控制器升级计划.

......

  经过几日废寝忘食地折腾,看着两台跑着Windows Server 2008 R2的域控制器的正式出山,老冯心里那叫一个美,那叫一个爽.

  美归美,爽归爽,工作还是要继续.

  "既然咱管的是AD DS,那就先在这上面做做文章吧!"老冯心里盘算着.

  "嗯,先不用去管什么RODC也不去理什么Fine-Grained Password Policies ,暂时都还没有这个需求,先把Active Directory Recycle Bin功能开起来再说."老冯打定了主意,自言自语道.(哈,老冯没上手R2之前可就做了不少功课哦.)

  "什么是Active Directory Recycle Bin啊,哥?"旁边的小周听到了老冯的话,问到.

  "活动目录回收站,比上回叫你用的那个adrestore还好使!"老冯边连接域控边回答到.

  "哦?是吗?这么强大呀,哥你给我讲讲这个呗..."小周很有兴致地凑了过来.

  老冯本着带徒弟就要带好的敬业精神,停下了手里的动作,"好吧,我先给你画个图."

  "在咱们以前用的Windows Server 2003还有Windows Server 2008的域控上,如果我们删除了一个活动目录对象,它有这样一个流程"老冯开始画着,

clip_image002

  "你看,比如上回被你误删的那些个账号,都会由活动状态转换为已逻辑删除状态,但是在墓碑生存期内它们还不会被彻底地物理删除,而是抛到'Deleted object'那个容器里了."

  "嗯,你上次跟我讲过,我记得,2003打了SP2补丁默认是180天嘛,只要没过180天都能从那里面再用工具救回来."

  "嗯,很好,但是你也看到了他的缺点,救回来的用户帐号的很多属性,像组成员关系呀还有姓名之类的都已经被清除了."

  "是啊,那次我手动一个一个加回去搞的好累呀."

  "额,那还不是怪你那快手...你还好意思喊累...",老冯心里这么想,嘴上接着说,"所以微软考虑到这一点,在Windows Server 2008 R2系统的活动目录新特性部分增加了这个AD回收站功能.我再给你画个图."

clip_image004

  "看到没有,现在的流程有些变化,在开启了AD回收站功能以后,被删除的对象会先进入'逻辑删除'状态,成为逻辑删除对象.处于这个状态的时候系统将会保留它所有的链接值属性和未链接值属性,而这个保留时间就是图上面的'已删除对象生存期',在这个生存期如果你没有还原它,那么它才会变成回收对象,被拿掉大多数属性,就和2003里面基本一样了.再等到'已回收对象生存期',也就是墓碑时间,过完之后才会被物理删除掉.这整个过程中,不管是'已删除对象'还是'已回收对象'都还是被放置在'Deleted object'这个容器里面的.明白了吗?"

  "额额,有点绕,是不是简单一点可以这样理解,开启了AD回收站就是比2003系统上多了一个中间状态,给了管理者更多的时间让我们能全方位地恢复删除对象."

  "理解的不错呀,小周",老冯赞许道.

  "那这个已删除对象的生存周期是多久啊?".

  "看来你是认认真真听了,呵呵",老冯打心眼里喜欢上了这个小朋友,"这样的,这个已删除对象的生存周期是由域架构里一个叫做'msDS-deletedObjectLifetime'的属性控制的,而已回收对象的生存周期还是由'tombstoneLifetime'墓碑生存时间控制着.默认情况下这个'msDS-deletedObjectLifetime'的值是null, 表示它的值跟从'tombstoneLifetime'的值. 而'tombstoneLifetime'的值依然和Server 2003上一样,还都是180天.当然了,这两个值是可以根据你的需求修改的."

  "哦哦,明白了!那我们赶紧动手吧!"小周已经远程连接到域控上迫不及待了.

  "呵呵,别急别急,要开启AD回收站还是稍微有点麻烦的."

  "嗯?..."

  "首先,我们要保证AD林中所有的域控制器都是Windows Server 2008 R2并且将林功能级别也提升到了Windows Server 2008 R2.我现在check一下."

clip_image006

  "好的,林功能级别已经是Windows Server 2008 R2了,我们可以进行下一步了,在powershell里添加AD管理模块."

  "还要用powershell呀?"小周对powershell也是久仰其名了.

  "不是一定要用powershell来开启AD回收站,也可以用ldp.exe工具,不过用ldp工具操作起来比较麻烦,没有用命令行来的干脆快捷,微软也是推荐使用powershell来操作的."

  "这样啊,那哥你开始操作吧,我在旁边看你操作,有问题就问你的哟."

  "恩,好的."

  说完,老冯打开域控上的powershell,只在里面输入了短短的一行命令:import-module activedirectory.

clip_image008

  回车以后就可以将AD模块加载到powershell中了.加载成功后可以在"所有程序"--->"管理工具"中看到新生成了一个"用于Windows PowerShell的Active Directory模块",双击开启它.启动之后,需要输入启用AD回收站的命令,格式为:

Enable-ADOptionalFeature -Identity <ADOptionalFeature> -Scope <ADOptionalFeatureScope> -Target <ADEntity>

  老冯套用到自己的实际情况,敲入命令: Enable-ADOptionalFeature –Identity ‘CN=Recycle Bin Feature,CN=Optional Features,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration, DC=northwind,DC=com’ –Scope ForestOrConfigurationSet –Target ‘northwind.com’

clip_image010

  回车后系统会提示说开启回收站特性是一个不可逆的操作,开启了之后就无法再关闭掉.

  输入Y确定之后回车,AD回收站就已经正式在Windows Server 2008 R2域控上被启用了.

  "我们来做个测试吧,这回玩点狠的,连OU都一起给他删掉."老冯想看看AD回收站和powershell能到底带来多大惊喜.

  于是,老冯在域控上新建立了一个OU"ship"(建立时勾选掉了"防止容器被意外删除"),里面又建立了两个用户,Jack和Rose,他俩都属于OU里一个叫"Titanic"的组,建好后等了几秒,老冯在OU"ship"上直接点击了删除.

clip_image012

clip_image014

  老冯又切换到powershell窗口,先使用Get-ADOBject cmdlet来查询被删除的Jack.

clip_image016

  看到Jack已经被放入Deleted Objects容器中了.接着使用restore-adobject 命令来试图还原他.

clip_image018

  看到英文提示:这个操作无法被执行,因为此对象的parent也被删除了.

  所以要还原Jack,必须先还原他以前所在的OU.

  所以老冯使用命令Get-ADObject -ldapFilter:"(msDS-LastKnownRDN=ship)" –IncludeDeletedObjects | Restore-ADObject来先将ship这个OU还原回来.

clip_image020

  到ADUC中看看,

clip_image022

  ship这个OU已经被还原回来了.

  随后老冯执行命令: Get-ADObject -SearchBase "CN=Deleted Objects,DC=northwind,DC=com" -Filter {lastKnownParent -eq "OU=ship,DC=northwind,DC=com"} -IncludeDeletedObjects | Restore-ADObject

clip_image024

  这条命令下去可是太强悍了,它的用意是将所有在ship这个OU下的被删除对象都还原回来.到ADUC上一看,

clip_image026

  连用户带组都被还原回来了.并且和Server 2003上最大的不同是,帐户没有被停用,链接值属性也还在...(还记得前面讲的"已删除对象生存期"的概念吗?呵呵~)

 

  有一点,老冯需要提醒大家,在生产环境中使用上面这种细粒度比较大的命令来还原一整个被误删除的OU和它里面全部的用户对象之后,很容易将一些非误删除的对象(比如正常作业kill掉的离职员工的帐号)也连带还原回来,这个时候还需要将它们再删除一遍.这种情况对于手头没有完备的离职员工信息统计或者是近一段时间频繁进行了删除帐号作业的域管理者,肯定是一种比较糟糕的体验.(但总比一个一个去还原OU里面的账户来的方便吧?见仁见智的选择了.)所以Windows Server 2008 R2对于OU的保护特别到位和贴心,在你新建一个OU时默认就会勾选着保护它不被意外删除的选项.

clip_image028

 

  "小周,怎么样?用了AD回收站和powershell有什么感想?"

  "我要买本书开始学powershell了!"

  孺子可教......

 

 

====================================================

本文部分参考: http://technet.microsoft.com/en-us/library/dd392261(WS.10).aspx