xp_instance_regread过程的应用

首先,来看SQL Server Profiler工具跟踪到的信息。

 

 

 具体代码是:

代码
use master
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-1AS [NumberOfLogFiles],
(
case when @SmoLoginMode < 3 then @SmoLoginMode else 9 endAS [LoginMode],
-1 AS [TapeLoadWaitTime],
ISNULL(@SmoMailProfile,N''AS [MailProfile],
@BackupDirectory AS [BackupDirectory],
@SmoPerfMonMode AS [PerfMonMode]

我们可以把上面的代码Copy到查询分析器上执行,返回类似的结果信息:

 

 

 这里可以看出返回的是默认的数据库文件存储位置,数据库备份路径等信息。

通过查询这里的代码,我们可以在注册表中快速检索到对应的位置:

HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server \MSSQL10.SQL2005DE\MSSQLServer\MSSQLServer

(注:SQL2000/SQL2005/SQL2008有些差异,但不难找到)

 

 

 

 

接下来我们可以做个很好玩的测试,就是读其他键值,看看是否可以读出来。如取得SQLServer协议中的命名管道名称,

先看下MSSQLSERVER的协议中,管道名称是什么,

 

 

  它在注册表的位置如图:

 

在查询分析器中,调用xp_instance_regread读取时这样:

 

 

Use master
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读取到别的注册表键值,如:

 

 


 

declare @tmp nvarchar(512)
        
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语句:

declare @tmp nvarchar(2000)
        
exec master.dbo.xp_instance_regread N'HKEY_CURRENT_USER', N'Volatile Environment', N'LOGONSERVER'@tmp Output

Select @tmp As [tmp]

GO

执行代码,这里,我收到了一个错误:

 

RegOpenKeyEx() 返回了错误2,“系统找不到指定的文件。”
消息22001,级别1,状态1


 原来我们这里,因为当前的MSSQLSERVER账号是 localSystem, 这一账号是无法访问HKEY_CURRENT_USER下的内容的我们可以修改为其他可以访问HKEY_CURRENT_USER的账号,如:

在 SQL Server 配置管理器(Microsoft Management Console)工具中,我们可以到

 

我这里把locaSystem账号改成Administrator账号

 

 

 

这样,我们再来执行上面的查询语句,看看结果:

 

 OK 了,问题能得到解决了。

 

好了,前面些的是说是读实例属性中的一些参数,可以使用存储过程xp_instance_regread,要是想设置数据库文件默认位置,可以调用xp_instance_regwrite,如:

 

 

EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', REG_SZ, N'D:\SQL2008DATA\DE'
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/xp_regread-RegQueryValueEx-returned-error-2-the-system-cannot-find-the-file-specified.aspx

 

http://www.kodyaz.com/articles/article.aspx?articleid=48

 

 

(完)

 

No incapable except unthinkable.                 

MSN:weiguohao008@hotmail.com

 


 

 

 

posted @ 2010-07-06 08:01  ok_008  阅读(5133)  评论(0)    收藏  举报
给我写信