Sql xp\U cmdshell的单线替代方案?我试过几种方法

Sql xp\U cmdshell的单线替代方案?我试过几种方法,sql,sql-server,sql-server-2008,tsql,sql-server-2000,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2000,您好Microsoft SQL Server Masters 我有一个Microsoft SQL Server 2000,如下所述: Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.2 (Build 3790: Service Pack 2)

您好Microsoft SQL Server Masters

我有一个Microsoft SQL Server 2000,如下所述:

Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
May  3 2005 23:18:38 
Copyright (c) 1988-2003 Microsoft Corporation
Desktop Engine on Windows NT 5.2 (Build 3790: Service Pack 2)
我需要从这个Microsoft SQL Server执行一个操作系统命令,我检查了我对下面的查询是否具有系统管理员权限,它返回“1”,这确认了我的权限

SELECT IS_SRVROLEMEMBER('sysadmin', 'sa');
我尝试了传统的xp_cmdshell,但什么也没发生,只是为了确保它正常工作,我尝试了著名的:

EXEC xp_cmdshell 'dir c:\'; EXEC master.dbo.xp_cmdshell 'dir c:\';
EXEC master..xp_cmdshell "dir c:\";
而且都没有返回任何内容,这让我相信xp_cmdshell不可用。我知道xp_cmdshell在MicrosoftSQLServer2005中是默认禁用的,但在2000年没有。无论如何,我尝试以相同的方式重新启用它,但失败了

我查看了internet,发现了重新启用Microsoft SQL Server 2000 xp_cmdshell的方法:

exec sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'

exec sp_addextendedproc xp_cmdshell, 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
然而,它仍然不起作用。我发现另一篇文章说,有时管理员会删除这些文件,我想这可能是我的情况,文章说,如果删除了,我可以执行“xp_msver”,在我的情况下,它也不会返回任何内容

参考:

我还尝试了在internet上找到的这个查询,以查看xp_cmdshell是否存在,但它没有返回任何内容(但这可能是我奇怪的SQL客户端的一个限制,请参见下面的内容)

所以,我真的遇到了麻烦,我在谷歌进行了研究,发现了一些潜在的解决方案,如作业代理、SSIS包、CLR存储过程、sp_OACreate(和friends)和SQLCMD,但都没有效果。也许我做得不对,但我的另一个限制是,我只能从跳转框(Linux)访问此Microsoft SQL Server 2000,该跳转框有一个非常奇怪的SQL Server客户端,不接受多行查询,因此我无法成功尝试以下潜在解决方案:

1#工作代理

DECLARE @jobID uniqueidentifier, @cmd varchar(1000) 

SET @cmd = 'netstat -na > c:\connections.txt'

EXEC msdb.dbo.sp_add_job @job_name = '_tmp_MakeDirectory', @enabled  = 1, @start_step_id = 1, @owner_login_name='sa', @job_id = @jobID OUTPUT 

EXEC msdb.dbo.sp_add_jobstep @job_id = @jobID, @step_name = 'Create Backup Folder', @step_id = 1, @subsystem = 'CMDEXEC', @command = @cmd

EXEC msdb.dbo.sp_add_jobserver @job_id = @jobID

EXEC msdb.dbo.sp_start_job @job_id = @jobID, @output_flag = 0 

WAITFOR DELAY '000:00:05' -- Give the job a chance to complete

IF EXISTS (SELECT name FROM msdb.dbo.sysjobs WHERE name = '_tmp_MakeDirectory')
BEGIN
     EXEC msdb.dbo.sp_delete_job @job_name = '_tmp_MakeDirectory'
END
2#SQLCMD

不幸的是,我没有任何其他方法来访问这个Microsoft SQL Server,我知道这不是最好的方法,但这就是它的方式,我什么也做不了。因此,我需要一个解决方案来在这个具有所有这些限制的MicrosoftSQLServer2000上执行操作系统命令。有人能为一行查询移植上述两种方法中的任何一种吗

任何其他带有示例的建议都是非常受欢迎的

非常感谢


问候。

在CLR支持出现之前,我曾经使用xp\u cmdshell。不幸的是,您的版本与CLR支持(SQL Server 2005)和system.io命名空间不符。但是,您可以创建自己的扩展存储过程,该过程可以访问文件系统并创建目录。有关更多信息,请参见此处:


顺便说一句,xp_cmdshell是一个扩展存储过程。

当您运行最后两个选项中的一个时,您会看到什么错误?“…我的另一个限制是,我只能从跳转框(Linux)访问此Microsoft SQL Server 2000,该跳转框中有一个非常奇怪的SQL Server客户端,不接受多行查询,…”这听起来令人不安,像是注射黑客。嗨,文斯。我没有看到任何答案,它只是返回到提示。知道吗?印“福”行吗?我不行。认真地打印命令是否正常工作对于诊断此问题非常重要。xp_cmdshell完全有可能正常工作,但是您的Linux客户端没有显示输出。PRINT发送的输出与sp_cmdshell相同(非表格、辅助通道),因此这是一个很好的测试。(仅供参考,大多数简单的客户端都不会捕获这种输出)。感谢Brian的帮助,我说服了我的客户安装sqsh,现在我的帖子中描述的方法之一成功了。顺便说一句,这种CLR支持以及创建自己的xp_cmdshell似乎非常有趣,如果您有工作示例并想在这里发布,我相信它将对其他人有所帮助。非常感谢你。
DECLARE @jobID uniqueidentifier, @cmd varchar(1000) 

SET @cmd = 'netstat -na > c:\connections.txt'

EXEC msdb.dbo.sp_add_job @job_name = '_tmp_MakeDirectory', @enabled  = 1, @start_step_id = 1, @owner_login_name='sa', @job_id = @jobID OUTPUT 

EXEC msdb.dbo.sp_add_jobstep @job_id = @jobID, @step_name = 'Create Backup Folder', @step_id = 1, @subsystem = 'CMDEXEC', @command = @cmd

EXEC msdb.dbo.sp_add_jobserver @job_id = @jobID

EXEC msdb.dbo.sp_start_job @job_id = @jobID, @output_flag = 0 

WAITFOR DELAY '000:00:05' -- Give the job a chance to complete

IF EXISTS (SELECT name FROM msdb.dbo.sysjobs WHERE name = '_tmp_MakeDirectory')
BEGIN
     EXEC msdb.dbo.sp_delete_job @job_name = '_tmp_MakeDirectory'
END
CREATE PROCEDURE SQLCMD_TEST
AS
    !!MKDIR "netstat -na > c:\connections.txt"
    :OUT "C:\TEST\test.TXT"
    SELECT @@VERSION AS 'SERVER VERSION'
    !!DIR
GO
    SELECT @@SERVERNAME AS 'SERVER NAME'
GO 


EXEC SQLCMD_TEST