こんにちは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つの方法のいずれかを移植できますか?
例を挙げた他の提案は大歓迎です。
どうもありがとう。
よろしく。