2 Mart 2012 Cuma

SQL Server - xp_cmdshell ile Server ı Yönetmek


DBA olarak bazen system üstünde işlem yapmak isteyebilirsiniz. Yada server da windows account umuz yoktur ama windows üzerinde bir işlem yapmamız gerekebilir. Böyle bir durumda xp_cmdshell imdadınıza yetişecektir.

xm_cmdshell ile windows üzerinde işlettiğiniz komutları SQL Server aracılığıyla yapabilirsiniz. Burada yapabilecekleriniz SQL Server service account unun yapabilecekleri ile sınırlı. Eğer local admin se değmeyin keyfimize :)

xm_cmdshell i SQL Server da kullanan login in sysAdmin olması gerekmekte. Bu şekilde bir sysAdmin user ıyla ilk denememizi yapalım.

Örneğin c:\ klasörüne dır çekelim.

xp_cmdshell 'dir c:\' 

Execute ettiğimizde aşağıdaki gibi bir hata aldığınız değil mi?

Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1
SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

Bunun sebebi SQL Server kurulumunda güvenlikten dolayı default olarak xm_cmdshell in disable gelmesi. Dolayısıyla bu işlemi gerçekleştirmek istiyorsak xp_cmdshell i enable etmeliyiz.


xp_cmdshell i sp_configure ile enable edebiliriz. bunun için aşağıdaki kodu execute etmeniz yeterlidir.

sp_configure 'show advanced options',
reconfigure 
GO 
sp_configure 'xp_cmdshell',
reconfigure

dir komutunu tekrar çalıştırırsak sonucu göreceğizdir.

xp_cmdshell 'dir c:\' 




Yazımın başında xp_cmdshell i kullanabilmek için sysAdmin olmak gerekiyor demiştim.
SQL Server da xp_cmdshell i kullanabilmek için sysAdmin rolüne sahip olmak gerekmektedir. Ya da proxy account kullanmak gerekmektedir.

Bugünkü makalemizin konusuda proxy account kullanarak sysAdmin olmayan user lara xp_cmdshell i kullandırabilmek için yapılması gereken ayarların ne olduğunu anlatmak olacaktır.
Adım olarak denemeler yapacağız bir sql login create edelim ve master a map yapalım. Kullanıcı adı xpDeneme ve şifresi x.

USE [master] 
GO 
CREATE LOGIN [xpDeneme] WITH PASSWORD=N'x', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO 
USE [master] 
GO 
CREATE USER [xpDeneme] FOR LOGIN [xpDeneme] 
GO

Şu an da xpDeneme user ı ile SQL Server üzerinden xp_cmdshell 'dir' komutunu çalıştırırsanız aşağıdaki gibi bir hata alacaksınızdır.

The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.


Bu hatayı almaktayız, çünkü xpDeneme login i sysAdmin değil. Dolayısıyla proxy account kullanmamız gerekmekte. Bunun için aşağıdaki kodu server üzerinde yetkili bir windows yada domain user çalıştıralım.

EXEC sp_xp_cmdshell_proxy_account 'windowsusername', 'password'; 
GO

xpDeneme login i için master db sinde bulunan xp_cmdshell e execute yetkisi verelim

GRANT exec ON xp_cmdshell TO xpDeneme 
GO

xpDeneme login i ile tekrar xp_cmdshell 'dir' kodunu çalıştırırsak sonucun geldiğini göreceksiniz. Dolayısıyla işlemlerimizi tamamlamış oluyoruz.
 Burada dikkat etmeniz gereken şöyle bir şey var. Bütün ayarlamaları yapmış olmanıza rağmen aşağıdaki gibi bir hata almanız mümkün.

An error occurred during the execution of sp_xp_cmdshell_proxy_account. Possible reasons: the provided account was invalid or the '##xp_cmdshell_proxy_account##' credential
Bunun sebebide 4.adım ı server üzerinde yetkili olan bir user için yapmamış olmanız. Bu adıma da dikkat ederseniz bir sorun yaşayacağınızı düşünmüyorum.

Hiç yorum yok:

Yorum Gönder