在Windows操作系统上,每个服务都有一个启动的账号,这个账号的权限决定了这个服务可以访问那些资源。默认情况下,SQL SERVER可能使用system这个账号作为服务启动账号。我们经常在一些文章中看到说使用system作为SQL SERVER服务的启动账号不安全,这说法没错,确实不安全,下面的实验将验证这一点。
    配置:
             Windows 2003 enterprise 32位或者64位
             SQL SERVER 2005 enterprise 32位或者64位
             需要有sa权限的用户,这里使用sa
通过SQL SERVER***操作系统,基本上是通过SQL SERVER的xp_cmdshell实现的。这是这个程序可以让用户通过SQL SERVER执行命令行程序。前面说过启动服务账号的权限决定了这个服务有哪些权限,如果启动SQL SERVER服务的账号有创建Windows帐号的权限,那么就能通过SQL SERVER创建账号。
首先执行下面的代码将xp_cmdshell开启:
 
  1. use master 
  2. go 
  3. sp_configure 'show advanced options',1; 
  4. --使得能够更改高级配置 
  5. go 
  6. reconfigure 
  7. go 
  8. sp_configure 'xp_cmdshell',1; 
  9. --打开xp_cmdshell扩展 
  10. go 
  11. reconfigure 
  12. go 
然后到SQL SERVER的SQL Server 配置管理器管理去检查一下你的SQL SERVER服务是用什么账号启动,如下图所示。
 

SQL SERVER配置管理器

现在执行下面的代码:
 
  1. xp_cmdshell 'net user abc1 a9F /add' 
这将会在你的操作系统中添加一个名为abc1密码为a9f的用户,到中看看就知道有没有了:
然后依次使用不同的服务账号来测试,看那用那些账号启动SQL SERVER会导致用户使用xp_cmdshell往操作系统中加账号。建议建立一普通user,然后使用这个账号启动SQL SERVER服务。
    另外如果你使用服务管理去更改SQL SERVER的启动账号,可能导致你的SQL SERVER无法启动,而是用SQL Server 配置管理器去更改启动账号时,SQL Server 配置管理器会将一些目录的权限也配置好,避免账号没有写某些目录的权限。xp_cmdshell在SQL SERVER 2005中很难被删掉。