• 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

     


  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/wghao/p/1771837.html
Copyright © 2020-2023  润新知