SQL 服务使用localSystem帐户,如何安装TFS 2005 SP1?

(English Version)

如果在TFS2005部署中,数据层服务器上SQL 服务运行在localsystem帐户下,而不是一个域用户帐户,那么TFS2005 SP1安装可能会遇到下面的问题:

 

症状:

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

l TFS2005 SP1安装程序中途消失,没有任何错误信息出现;

l SP1没有成功安装。且安装程序消失之后,客户端无法访问TFS服务;

l SP1安装日志中可以看到如下内容(采自英文版)

08/29/07 17:06:22 DDSet_Status: Commandline: "C:\Program Files\Microsoft Visual Studio 2005 Team Foundation Server\TF Setup\TFSQuiesce.exe" /n:"Quiesce ATDT"

……

Blocking service account from accessing database TFSActivityLogging

Could not obtain information about Windows NT group/user 'KF\tfsservice', error code 0x5.

……

Workflow 'Quiesce ATDT' failed! ExitCode = 9000.

……

Action ended 17:06:50: InstallFinalize. Return value 3.

----------------------------------------------------

--- Failure on trying to access TFSActivityLogging database

已有的规避方法:

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

KB948778 提供了规避问题的方法:配置SQL服务使用一个域管理员身份帐户运行。

但是有些用户可能出于安全管理策略的限制,需要避免使用如此敏感的帐户。其实,SQL服务使用LocalSystem帐户的情况下,只要做一些权限上的检查和配置,依然可以成功安装TFS2005 SP1。这里是分享我的经验。

问题根源:

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

从日志中我们可以了解到安装失败发生在操作数据库的过程中,因此我们收集了SQL Server Profiler日志(这是什么?)。日志显示错误发生在针对TFSWorkItemTracking数据库执行一条指令时:

alter login [domain\TFS_Service_Account] disable

                   错误: 无法获取关于Windows NT 组/用户 “domain\account”的信息,错误号0x5 (0x5 代表访问被拒-作者)

SQL Server, Active Directory和TFS技术支持工程师协作弄清了整个错误发生过程:

1. ”Alter login”语句比较特殊。执行这条语句的时候,SQL Server不是使用执行setup的交互式登陆用户身份,而是使用SQL服务帐户LocalSystem;

2. SQL在执行语句的时候,需要查询域控制器上保存的用户组成员数据。使用数据库服务器LocalSystem帐户执行的查询在域控制器上看来是来自该计算机帐户;

3. 在一个2003活动目录中,默认的安全策略认为所有可识别用户(包括数据层服务器帐户)属于“pre-windows 2000 compatible access”组。这个组的成员可以访问所有的AD对象数据。但是在我的客户的域中,由于安全方面的考虑它们修改了默认安全设置。数据层服务器帐户不再是“pre-windows 2000 compatible access”组成员,因此也不再被允许访问所需的AD组成员信息。

解决方案:

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

在域控制器上运行下面的命令恢复默认AD组成员关系:

net localgroup "pre-windows 2000 compatible access" "nt authority\authenticated users” /add

net localgroup “Pre-Windows 2000 Compatible Access” Domain\DTBoxName$ /Add

之后我们就可以在SQL服务使用LocalSystem帐户的情况下成功安装TFS2005SP1了。

结论是,安装TFS2005SP1并不一定需要SQL服务运行于域管理员身份下。只要服务帐户可以查询所需域对象信息就OK。