zoukankan      html  css  js  c++  java
  • 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

     


  • 相关阅读:
    数据库>SQL Server2005>第4季SQL从入门到提高>13练习1
    重学>ASP.NET小实例>DataReader手工分页
    数据库>SQL Server2005>第4季SQL从入门到提高>8Uoin
    世界上最快乐的人>空性的禅修练习
    数据库>SQL Server2005>第4季SQL从入门到提高>11练习和12练习1
    数据库>SQL Server2005>随机遇到问题>查询name重复,id不重复,时间最新的记录
    XSS CSRF 攻击
    js随笔小技巧
    javascript 常用开源函数库以及学习网站
    php 检测用户是否关闭浏览器
  • 原文地址:https://www.cnblogs.com/wghao/p/1771837.html
Copyright © 2011-2022 走看看