首先,来看SQL Server Profiler工具跟踪到的信息。
具体代码是:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
Go
declare @SmoAuditLevel int
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' AuditLevel ' , @SmoAuditLevel OUTPUT
declare @SmoDefaultFile nvarchar ( 512 )
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' DefaultData ' , @SmoDefaultFile OUTPUT
declare @SmoDefaultLog nvarchar ( 512 )
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' DefaultLog ' , @SmoDefaultLog OUTPUT
declare @NumErrorLogs int
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' NumErrorLogs ' , @NumErrorLogs OUTPUT
declare @SmoLoginMode int
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' LoginMode ' , @SmoLoginMode OUTPUT
declare @SmoMailProfile nvarchar ( 512 )
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' MailAccountName ' , @SmoMailProfile OUTPUT
declare @BackupDirectory nvarchar ( 512 )
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' BackupDirectory ' , @BackupDirectory OUTPUT
declare @SmoPerfMonMode int
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' Performance ' , @SmoPerfMonMode OUTPUT
if @SmoPerfMonMode is null
begin
set @SmoPerfMonMode = 1000
end
SELECT
' Server[@Name= ' + quotename ( CAST (
serverproperty(N ' Servername ' )
AS sysname), '''' ) + ' ] ' + ' /Setting ' AS [ Urn ] ,
@SmoAuditLevel AS [ AuditLevel ] ,
ISNULL ( @SmoDefaultFile ,N '' ) AS [ DefaultFile ] ,
ISNULL ( @SmoDefaultLog ,N '' ) AS [ DefaultLog ] ,
ISNULL ( @NumErrorLogs , - 1 ) AS [ NumberOfLogFiles ] ,
( case when @SmoLoginMode < 3 then @SmoLoginMode else 9 end ) AS [ LoginMode ] ,
- 1 AS [ TapeLoadWaitTime ] ,
ISNULL ( @SmoMailProfile ,N '' ) AS [ MailProfile ] ,
@BackupDirectory AS [ BackupDirectory ] ,
@SmoPerfMonMode AS [ PerfMonMode ]
我们可以把上面的代码Copy到查询分析器上执行,返回类似的结果信息:
这里可以看出返回的是默认的数据库文件存储位置,数据库备份路径等信息。
通过查询这里的代码,我们可以在注册表中快速检索到对应的位置:
(注:SQL2000/SQL2005/SQL2008有些差异,但不难找到)
接下来我们可以做个很好玩的测试,就是读其他键值,看看是否可以读出来。如取得SQLServer协议中的命名管道名称,
先看下MSSQLSERVER的协议中,管道名称是什么,
![](https://i-blog.csdnimg.cn/blog_migrate/422f60b6693c1fc69e51adf7d9a6fe92.jpeg)
它在注册表的位置如图:
在查询分析器中,调用xp_instance_regread读取时这样:
Go
declare @PipeName nvarchar ( 512 )
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Np ' , N ' PipeName ' , @PipeName Output
Select @PipeName As [ PipeName ]
它能返回类似"\\.\pipe\sql\query"的管道名称.
O(∩_∩)O~,有点意思了。当然我们也可以通过xp_instance_regread读取到别的注册表键值,如:
exec master.dbo.xp_instance_regread N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\Active Setup\Install Check ' , N ' IE40 ' , @tmp Output
Select @tmp As [ tmp ]
这个不是MSSQL Instance下的一样可以读取。,但必须是在HKEY_LOCAL_MACHINE根下,不然可能会出现错误:
如,我们要查HKEY_CURRENT_USER\Volatile Environment下的LOGONSERVER键值“\\WWW-57F11DF7D7A”。
SQL语句:
exec master.dbo.xp_instance_regread N ' HKEY_CURRENT_USER ' , N ' Volatile Environment ' , N ' LOGONSERVER ' , @tmp Output
Select @tmp As [ tmp ]
GO
执行代码,这里,我收到了一个错误:
消息22001,级别1,状态1
原来我们这里,因为当前的MSSQLSERVER账号是 localSystem, 这一账号是无法访问HKEY_CURRENT_USER下的内容的, 我们可以修改为其他可以访问HKEY_CURRENT_USER的账号,如:
在 SQL Server 配置管理器(Microsoft Management Console)工具中,我们可以到
我这里把locaSystem账号改成是Administrator账号
这样,我们再来执行上面的查询语句,看看结果:
![](https://i-blog.csdnimg.cn/blog_migrate/eb36f315447d7916c5cf99dfcbf60b28.jpeg)
OK 了,问题能得到解决了。
好了,前面些的是说是读实例属性中的一些参数,可以使用存储过程xp_instance_regread,要是想设置数据库文件默认位置,可以调用xp_instance_regwrite,如:
EXEC xp_instance_regwrite N ' HKEY_LOCAL_MACHINE ' , N ' Software\Microsoft\MSSQLServer\MSSQLServer ' , N ' DefaultLog ' , REG_SZ, N ' D:\SQL2008DATA\DE '
这里看到,语法使用简单,没有什么难。
最后,这里列出一些有关注册表扩展存储的过程,有兴趣的朋友可以自己去研究下:
- xp_regread
- xp_instance_regread
- xp_regenumkeys
- xp_instance_regenumkeys
- xp_regenumvalues
- xp_instance_regenumvalues
- xp_regwrite
- xp_instance_regwrite
- xp_regaddmultistring
- xp_instance_regaddmultistring
- xp_regremovemultistring
- xp_instance_regremovemultistring
- xp_regdeletevalue
- xp_instance_regdeletevalue
- xp_regdeletekey
- xp_instance_regdeletekey
注:当使用注册表扩展存储的过程时,可能会收到错误消息,这个错误信息有可能与SQL Server用户账号权限无关,只是MS因安全考虑,在内部做一些访问控制。具体看查询类似的Support:
http://support.microsoft.com/kb/887165
其他可以参考:
http://www.kodyaz.com/articles/article.aspx?articleid=48
(完)
No incapable except unthinkable.
MSN:weiguohao008@hotmail.com