VN:F [1.7.9_1023]
Rating: 0.0/5 (0 votes cast)

Procedura rozszerzona xp_cmdshell  dostępna w SQL Server bywa przedmiotem dyskusji na temat bezpieczeństwa i tego, czy system zarządzania bazami danych powinien mocno integrować się z systemem operacyjnym. Domyślnie procedura ta jest wyłączona dzięki jednej z opcji serwera, ale często jest włączana i wykorzystywana, głównie do uruchamiania zewnętrznych aplikacji z poziomu kodu T-SQL.

Ostatnio natknąłem się na problem, którego rozwiązanie zajęło mi chwilę. I postanowiłem, że swoim rozwiązaniem się podzielę.

Na początek włączamy xp_cmdshell na instancji SQL Servera:

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
GO

Próba uruchomienia xp_cmdshell:

EXEC master.dbo.xp_cmdshell 'dir "C:\Program Files"';
GO

Wynikiem jest lista katalogów i plików z folderu Program Files na dysku C:. Warto tu zwrócić uwagę na fakt, że parametr polecenia dir (listowanie plików i katalogów w systemie Windows) został otoczony cudzysłowami, ponieważ zawierał spację (gdyby cudzysłowów nie dać, napis zostałby potraktowany jako dwa parametry).

Problem pojawia się, gdy chcemy uruchomić zewnętrzną aplikację / wsad (.bat lub .cmd), do której ścieżka zawiera spacje z parametrem, w którym spacje również występują. Przykład:

EXEC master.dbo.xp_cmdshell '"D:\SQL Server\ProcessCube.bat" "My DB" "My Cube"';
GO

Próba wykonania powyższego kodu, przy założeniu, że wsad ProcessCube.bat naprawdę istnieje w lokalizacji D:\SQL Server, zakończy się komunikatem:

Nazwa ‘D:\SQL’ nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne, program wykonywalny lub plik wsadowy.

Szczerze mówiąc, nie wiem, jaka jest przyczyna problemu, ale obstawiam jakiś błąd w xp_cmdshell.

Obejście problemu jest dość proste:

EXEC master.dbo.xp_cmdshell 'call "D:\SQL Server\ProcessCube.bat" "My DB" "My Cube"';
GO

Trzeba zapewnić, że pierwsze w ciągu znaków podawanym jako parametr procedury xp_cmdshell będzie polecenie systemowe (do którego nie potrzeba podawać pełnej ścieżki). Może to być, jak powyżej, polecenie CALL (uruchamianie wsadu z innego wsadu – tak naprawdę można w ten sposób uruchamiać także wsady z konsoli).

Ot, czym czasem musi zajmować się konsultant Business Intelligence ;-)