2

こんにちはMicrosoftSQLServerマスター、

さて、私は以下に説明するようにMicrosoft SQL Server2000を持っています:

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)

このMicrosoftSQLServerからオペレーティングシステムコマンドを実行する必要があります。以下のクエリでsysadmin特権があることを確認したところ、「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はMicrosoftSQLServer 2005ではデフォルトで無効になっていることは知っていますが、2000年にはそうではありませんでした。とにかく、同じ方法でxp_cmdshellを再度有効にしようとしましたが、失敗しました。

インターネットを調べたところ、Microsoft SQLServer2000で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」を実行でき、私の場合は何も返さないという記事があります。

参照:http ://support.microsoft.com/kb/891984

また、インターネットで見つけたこのクエリを試して、xp_cmdshellが存在するかどうかを確認しましたが、何も返されませんでした(ただし、これは私の奇妙なSQLクライアントの制限である可能性があります。以下を参照してください)。

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[ xp_cmdshell]‘) and OBJECTPROPERTY(id, N’IsExtendedProc’) = 1);

それで、私は本当に困っています。Googleで調べて、ジョブエージェント、SSISパッケージ、CLRストアドプロシージャ、sp_OACreate(およびその仲間)、SQLCMDなどの潜在的なソリューションを見つけましたが、何も機能しませんでした。間違ったことをしたかもしれませんが、私の場合のもう1つの制限は、複数行のクエリを受け入れない非常に奇妙なsql-serverクライアントを持つジャンプボックス(Linux)からこのMicrosoft SQLServer2000にアクセスできることです。したがって、次の潜在的な解決策を成功させることはできません。

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

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

残念ながら、このMicrosoft SQL Serverにアクセスする方法は他にありません。これが最善の方法ではないことはわかっていますが、それが最善の方法であり、何もできません。したがって、このMicrosoft SQL Server 2000でオペレーティングシステムコマンドを実行するためのソリューションが必要ですが、このすべての制限があります。誰かが1行のクエリに対して上記の2つの方法のいずれかを移植できますか?

例を挙げた他の提案は大歓迎です。

どうもありがとう。

よろしく。

4

1 に答える 1

1

CLRがサポートされる前は、xp_cmdshellを使用していました。残念ながら、CLRサポート(SQL Server 2005)およびsystem.io名前空間から離れたバージョンです。ただし、ファイルシステムにアクセスしてディレクトリを作成できる独自の拡張ストアドプロシージャを作成することはできます。詳細については、こちらを参照してください:http ://www.devarticles.com/c/a/SQL-Server/Extended-Stored-Procedures-Intro-And-10-Cool-Examples/

ちなみに、xp_cmdshellは拡張ストアドプロシージャです。

于 2012-04-08T01:45:57.100 に答える