首先,来看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
,
-
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到查询分析器上执行,返回类似的结果信息:
这里可以看出返回的是默认的数据库文件存储位置,数据库备份路径等信息。
通过查询这里的代码,我们可以在注册表中快速检索到对应的位置:
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:[email protected]