Warum schlägt ein Skript mit "xp_cmdshell" im Kommentar mit einem Fehler auf Transportebene fehl?


7

Wenn Sie den folgenden Stapel ausführen, der Teil eines großen Skripts ist:

...
GO
-----------------------------------------------------------------------------------------------
-- Removed the xp_cmdshell for deleting the backup file 
-----------------------------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PR_MyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PR_MyProc]
GO
...

Auf einem Remote-SQL Server wird der folgende Fehler angezeigt:

Meldung 121, Ebene 20, Status 0, Zeile 0 Beim Empfang der Ergebnisse vom Server ist ein Fehler auf Transportebene aufgetreten. (Anbieter: TCP-Anbieter, Fehler: 0 - Das Zeitlimit für das Semaphor ist abgelaufen.)

Wenn wir "xp_cmdshell" aus dem Kommentar entfernen, ist der Stapel erfolgreich. Dieser Fehler tritt nur auf einigen unserer SQL Server auf. Wir führen das Skript remote aus. Die fehlgeschlagene Version von SQL Server lautet:

Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 20. Februar 2014 20:04:26 Copyright (c) Microsoft Corporation Standard Edition (64-Bit) unter Windows NT 6.2 (X64) (Build 9200 :) (Hypervisor)

Auf einem anderen Server ist dasselbe Skript erfolgreich. Dieser Server hat diese Version:

Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 20. Februar 2014 20:04:26 Copyright (c) Microsoft Corporation Standard Edition (64-Bit) unter Windows NT 6.1 (X64) (Build 7601: Service Pack 1) (Hypervisor)

Auf beiden Servern ist xp_cmdshell aktiviert. Auf dem fehlerhaften Server wird Windows 2012 R2 ausgeführt, und auf dem erfolgreichen Server wird Windows Server 2008 R2 SP1 ausgeführt. Wenn wir das Skript lokal auf dem Server ausführen, ist es erfolgreich. Wenn wir das Skript remote von einem anderen virtuellen Server ausführen, schlägt es fehl. Wir haben auch festgestellt, dass das Skript nur fehlschlägt, wenn der Kommentar "(Leerzeichen) xp_cmdshell (Leerzeichen)" enthält.

Kann mir jemand sagen, warum dieses Skript fehlschlägt? Und warum schlägt es auf einigen Servern fehl und auf anderen nicht?

Auf dem Server wird kein Antivirenprogramm ausgeführt. SQL Server Management Studio ist verbunden. Das Ändern des zu entfernenden Kommentars ist xp_cmdshellimmer erfolgreich und das ursprüngliche Skript schlägt immer fehl.

Antworten:


6

Es gibt ein Verbindungselement, das genau dieses Problem bespricht (gut bespricht ...), daher scheint es ein Fehler zu sein.

Der Text 'xp_cmdshell' verursacht einen Fehler auf Transportebene: Das Zeitlimit für das Semaphor ist vom Remote-System abgelaufen

Es scheint, dass die Zeichenfolge Probleme verursacht, nicht nur in Kommentaren, sondern auch überall dort, wo sie als exakte Zeichenfolge verwendet wird

SELECT 'xp_cmdshell'

führt laut Fehlerbericht zum gleichen Fehler.

Es scheint also, dass die genaue Zeichenfolge xp_cmdshelltatsächlich das Problem ist. Leider wird das Verbindungselement als "nicht reproduzierbar" geschlossen.
Abgesehen davon kann ich es (auf einer lokalen Verbindung) auch nicht auf meinem SQL 2014-Testsystem (12.0.2000.8, Windows NT 6.3 (Build 9600 :)) reproduzieren, sodass das Betriebssystem wahrscheinlich relevant ist. Das Ausführen der Abfrage von einem lokalen Verwaltungsstudio aus über das Netzwerk kann ebenfalls relevant sein, wie im Verbindungselement angegeben.

Sie können dies also umgehen, indem Sie den genauen Text ändern (wie Sie es getan haben) oder versuchen, das Verbindungselement erneut zu öffnen oder einen Fehlerbericht über den Microsoft-Support einzureichen.


+1 Bei der anderen Frage, bei der die SQL-Abfrage aufgrund eines kommentierten Teils der T-SQL-Abfrage fehlschlägt , haben wir festgestellt, dass dies nicht so einfach ist wie der Text "xp_cmdshell". Wenn Sie beispielsweise --links hinzufügen, schlägt dies nicht fehl. Wenn Sie es in einer eigenen Zeile, aber ohne Parameter rechts davon haben, wurde ein Syntaxfehler verursacht. Sehr seltsam unabhängig.
Solomon Rutzky

1

Unsere Problemumgehung bestand darin, xp_cmdshell aus unseren Kommentaren zu entfernen. Ich habe es durch "xp (space) cmdshell" ersetzt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.