在SharePoint 2010中,如何找回丢失的服务账号(Service Account)密码
背景信息:
通常在SharePoint环境中我们会使用很多的服务账号来运行各种不同的服务,尤其在企业环境中,由于权限管理条例严格,这些服务账号更是只能多不能少。面对如此多的服务账号,各个企业都会有自己管理账号的方式方法,比如使用KeyPass或者直接将密码明文文档化之类的方法等等。不过,万一的万一,你的密码丢掉了你要怎么办呢?
如果直接更换服务账号的密码,那么它所运行的服务很可能出现问题和错误。虽然SharePoint也给出了专门用于更换服务账号密码的命令方法,大大降低了风险,但不管怎么说,如果能直接把这些账号的密码找回来肯定是最安全的途径,所以值得一试。
前几天我就遇到这么一件事情,我们的一个SharePoint 2007的环境里因为时间过久,居然把所有在用的6个服务账号密码全部丢失了。。。这影响到了一系列的升级和纠错工作,于是我就开始想办法看能不能找回密码。在上网找资料的过程中,我找了这篇文章,虽然它是针对Windows Server 2008 + SharePoint 2010来写的,但还是给了我很大启示,稍后我也会写另一篇文章介绍如何在windows Server 2003+SharePoint 2007的环境中找回服务账号密码的方法。今天我们先说说这个。
解决方法:
文章的作者叫 Roger Cormier,他写了一个PowerShell脚本来专门找回服务账号的密码。
这样做有几个前提,首先你得使用IIS7并且安装有Appcmd.exe工具,因为它是找回密码的关键。
咱们先来直接看代码和中文注解
1 #设置变量 2 3 $AccountToRetrieve = "Domain\User" #指定你要找回密码的服务账号,这是整个代码中唯一需要你指定的内容,其它部分都可以照搬到你的环境中使用 4 5 #创建函数 6 7 Function VerifyTimerJob ($Filter) 8 { 9 $Timer = Get-SPTimerJob | ? {$_.displayname -like $Filter} 10 If ($Timer) 11 { 12 $timer.Delete() 13 } 14 } 15 16 #开始执行 17 18 $Farm = get-spfarm | select name 19 20 $Configdb = Get-SPDatabase | ? {$_.name -eq $Farm.Name.Tostring()} 21 22 $ManagedAccount = get-SPManagedAccount $AccountToRetrieve #从Farm中获取你要找回密码的服务账号对象 23 24 $WebApplication = new-SPWebApplication -Name "Temp Web Application" 25 -url "http://tempwebapplication" 26 -port 80 27 -AuthenticationProvider (New-SPAuthenticationProvider) 28 -DatabaseServer $Configdb.server.displayname 29 -DatabaseName TempWebApp_DB 30 -ApplicationPool "Password Retrieval" 31 -ApplicationPoolAccount $ManagedAccount 32 -hostheader "http://tempwebapplication" 33 #使用上一步中得到的服务账号来创建一个新的临时Web Application,而这个服务账号也就被用作了ApplicationPool的账号。这一步中没有要求你手动填写密码是由于上一步中直接得到的是服务账号的对象,里面已经包含了密码信息,所以在创建Web Application的时候直接指定给ApplicationPoolAccount这个属性即可,免去了输入密码的步骤。 34 35 $Password = cmd.exe /c $env:windir\system32\inetsrv\appcmd.exe list apppool "Password Retrieval" /text:ProcessModel.Password 36 #这步是最关键的,它通过调用appcmd.exe直接获取了上一步中我们新建的web application在IIS Application Pool中的服务账号密码。坦率的说,我也不明白为什么IIS要留出这么一个看上去很不安全的方法,也许微软有自己的考虑吧。 37 38 Write-Host "Password for Account " $AccountToRetrieve " is " $Password 39 40 $Filter = "Unprovisioning *" + $Webapplication.Displayname + "*" 41 42 VerifyTimerJob($Filter) 43 Remove-SPWebApplication $WebApplication -DeleteIISSite -RemoveContentDatabases -Confirm:$False 44 VerifyTimerJob($Filter) 45 #这几步都是一些后续工作,删除相关的timerjob和临时的web application,不做详解。 46 47 $ProvisionJobs = Get-SPTimerJob | ? {$_.displayname -like "provisioning web application*"} 48 if ($ProvisionJobs) 49 { 50 foreach ($ProvisionJob in $ProvisionJobs) 51 { 52 $ProvisionJob.Delete() 53 } 54 }
效果图如下:
其实看过脚本之后,很容易明白其实最关键的就是那句appcmd.exe list apppool "Password Retrieval" /text:ProcessModel.Password
通过appcmd的这个方法,你可以取出所有在Application Pool中已存在的application的账号密码,并且明文输出。而这个脚本其实做的就是用你指定的服务账号来在IIS中创建一个application,进而用此命令得到其账号密码。
由于我不是iis专家,对于其安全性就不做过多评论了。