2012-04-07 6 views
2

Hallo Microsoft SQL Server Masters,Eine einzeilige Alternative für xp_cmdshell? Ich habe versucht, einige Dinge

Nun, ich habe einen Microsoft SQL Server 2000, wie unten beschrieben:

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) 

Ich brauche einen Betriebssystembefehl von dem Microsoft SQL Server auszuführen, Ich habe überprüft, dass ich Sysadmin-Berechtigungen mit der Abfrage unten habe und es gab "1" zurück, was meine Berechtigung bestätigt.

SELECT IS_SRVROLEMEMBER('sysadmin', 'sa'); 

habe ich versucht, die traditionelle xp_cmdshell und es ist nichts passiert, nur um sicher zu machen, arbeitet ich die berühmten versucht:

EXEC xp_cmdshell 'dir c:\'; EXEC master.dbo.xp_cmdshell 'dir c:\'; 
EXEC master..xp_cmdshell "dir c:\"; 

Und alle zurück nichts, was ich, dass xp_cmdshell nicht verfügbar glauben machen ist. Ich weiß, dass xp_cmdshell in Microsoft SQL Server 2005 standardmäßig deaktiviert ist, aber nicht in 2000, trotzdem habe ich versucht, es auf die gleiche Weise wieder zu aktivieren, aber es ist fehlgeschlagen.

ich auf Internet sah, und ich fand diese Art und Weise xp_cmdshell für Microsoft SQL Server 2000 zu reaktivieren:

exec sp_addextendedproc 'xp_cmdshell', 'xplog70.dll' 

exec sp_addextendedproc xp_cmdshell, 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll' 

Es ist jedoch immer noch nicht funktioniert. Ich fand einen anderen Artikel, der sagte, dass Admins diese Dateien manchmal löschen und ich denke, dass es mein Fall ist, der Artikel sagt, dass, wenn es gelöscht wurde, ich "xp_msver" ausführen kann und in meinem Fall auch nichts zurückgibt.

Referenz: http://support.microsoft.com/kb/891984

Ich habe auch versucht, diese Abfrage, die ich im Internet gefunden, um zu sehen, ob xp_cmdshell existiert und es gab nichts zurück (aber es kann eine Einschränkung meines seltsamen SQL-Client sein, siehe unten).

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

Also, ich bin wirklich in Schwierigkeiten, recherchieren ich bei Google und fand mögliche Lösungen wie Job-Agent, SSIS-Paket, CLR gespeicherte Prozedur, sp_OACreate (und Freunde) und SQLCMD aber nichts funktionierte. Vielleicht habe ich es falsch gemacht, aber eine weitere Einschränkung in meinem Fall ist, dass ich gerade Zugang zu diesem Microsoft SQL Server 2000 von einer Sprungbox (Linux) habe, die einen sehr seltsamen SQL-Server-Client hat, der keine Abfragen mit mehreren Zeilen akzeptiert, folglich kann ich nicht mit Erfolg versuchen die folgenden möglichen Lösungen:

1 # Job Agent

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 

Leider habe ich keine andere Möglichkeit, dies zugreifen Microsoft SQL Server, ich weiß, es ist nicht der beste Weg, aber es ist, wie es ist und ich kann nichts tun. Also, ich brauche eine Lösung, um Betriebssystem-Befehle auf diesem Microsoft SQL Server 2000 mit all diesen Einschränkungen auszuführen. Kann jemand bitte eine der beiden obigen Methoden für eine einzelne Zeilenabfrage portieren?

Jeder andere Vorschlag mit Beispiel ist sehr willkommen.

Vielen Dank.

Grüße.

+0

Was ist der Fehler, den Sie sehen, wenn Sie eine der letzten beiden Optionen ausführen? –

+1

"... eine weitere Einschränkung in meinem Fall ist, dass ich gerade Zugang zu diesem Microsoft SQL Server 2000 von einer Sprungbox (Linux) habe, die einen sehr seltsamen SQL-Server-Client hat, der keine Anfragen mit mehreren Zeilen akzeptiert, .. . "Das klingt beunruhigend wie Injection-Hacking. – RBarryYoung

+0

Hallo Vince. Ich sehe keine Antwort, es kehrt nur zur Eingabeaufforderung zurück. Irgendeine Idee? – user1319402

Antwort

1

Ich habe xp_cmdshell verwendet, bevor die CLR-Unterstützung kam.Leider sind Sie eine Version von der CLR-Unterstützung (SQL Server 2005) und dem System.io-Namespace entfernt. Sie können jedoch eigene erweiterte gespeicherte Prozeduren erstellen, die auf das Dateisystem zugreifen und Verzeichnisse erstellen können. Siehe hier für weitere Informationen: http://www.devarticles.com/c/a/SQL-Server/Extended-Stored-Procedures-Intro-And-10-Cool-Examples/

Übrigens ist xp_cmdshell eine erweiterte gespeicherte Prozedur.

+0

Danke Brian für deine Hilfe, ich habe meinen Kunden überzeugt, sqsh zu installieren und nun funktioniert eine der Methoden, die auf meinem Beitrag beschrieben sind. BTW, diese CLR-Unterstützung und auch dies erstellen Sie Ihre eigenen xp_cmdshell scheint sehr interessant zu sein, wenn Sie Arbeitsbeispiele haben und hier posten möchte ich bin mir ziemlich sicher, dass es für jemanden hilfreich sein wird. Vielen Dank. – user1319402