xp_instance_regread过程的应用

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

xp_instance_regread过程的应用 

 

 具体代码是:

代码
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 - 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到查询分析器上执行,返回类似的结果信息:

 xp_instance_regread过程的应用

 

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

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

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

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

xp_instance_regread过程的应用 

 

 xp_instance_regread过程的应用

 

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

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

xp_instance_regread过程的应用 

 

  它在注册表的位置如图:

xp_instance_regread过程的应用 

在查询分析器中,调用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读取到别的注册表键值,如:

 

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”。


 

xp_instance_regread过程的应用 


 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账号

 

 

 

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

xp_instance_regread过程的应用

 

 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:[email protected]

 


 

 

 

你可能感兴趣的:(instance)