xp_cmdshell的使用筆記

維護一個舊案子, 又再重溫SQL Server中的xp_cmdshell功能。xp_cmdshell是一個藏在SQL Server內的超強功能, 但因為某個程度上來說太危險了, 早早就被官方或各方人士列為預設關閉的功能。老實說它就是一個可以用在T-SQL下使用的command shell, 凡是Windows下CMD命令提示字元中可以用的功能, 大多可以在xp_cmdshell中使用。

筆記一下重溫的內容:

  1. 相似於CMD, 但不是PowerShell。凡是PowerShell專用的指令, 皆不可用。
  2. 可以用 xp_cmdshell 'cd' 查目前所在路徑。查到的結果是 C:\Windows\system32
  3. 可以用 xp_cmdshell 'WhoAmI' 查目前執行身份。查到的結果是SQL Server服務的啟動身份, 例如: nt service\mssqlserver。遇到一個狀況, 有人提到要進行跨Server存取一個文字檔, 在CMD下可以透過一個share folder取得, 權限都設定好了, 驗證可以取得檔案, 結果透過xp_cmdshell時卻是一直出現存取被拒的錯誤。此時用這個WhoAmI查詢就一目瞭然, 因為身份與CMD的不同, 所以結果就不同。share folder取檔的變通做法 xp_cmdshell 'net use \\remote\path thePassWord /USER:remote\user && type \\remote\path\to\file.txt'
  4. 不能操作具UI互動功能, 因為與上一點的執行身份有關, 例如上一點這個服務的身份, 等於是執行在背景中, 若操作的是具UI互動功能, 也會卡在背景, 執行過程會像是永遠在進行中一樣卡住。例如, 若是做 xp_cmdshell 'path\to\file.txt' , 這動作預期會用Notepad開啟這個txt文字檔, 但因為透過服務身份執行, Notepad反而是執行在背景中, 前景只會看到無限轉動進行中, 甚至也無法正常停止。變通做法, 如果是像文字檔類的, 就用type指令吧,用 xp_cmdshell 'type path\to\file.txt' , 把檔案內容印出來就可以。

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料