維護一個舊案子, 又再重溫SQL Server中的xp_cmdshell功能。xp_cmdshell是一個藏在SQL Server內的超強功能, 但因為某個程度上來說太危險了, 早早就被官方或各方人士列為預設關閉的功能。老實說它就是一個可以用在T-SQL下使用的command shell, 凡是Windows下CMD命令提示字元中可以用的功能, 大多可以在xp_cmdshell中使用。
筆記一下重溫的內容:
- 相似於CMD, 但不是PowerShell。凡是PowerShell專用的指令, 皆不可用。
- 可以用
xp_cmdshell 'cd'查目前所在路徑。查到的結果是 C:\Windows\system32 - 可以用
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' - 不能操作具UI互動功能, 因為與上一點的執行身份有關, 例如上一點這個服務的身份, 等於是執行在背景中, 若操作的是具UI互動功能, 也會卡在背景, 執行過程會像是永遠在進行中一樣卡住。例如, 若是做
xp_cmdshell 'path\to\file.txt', 這動作預期會用Notepad開啟這個txt文字檔, 但因為透過服務身份執行, Notepad反而是執行在背景中, 前景只會看到無限轉動進行中, 甚至也無法正常停止。變通做法, 如果是像文字檔類的, 就用type指令吧,用xp_cmdshell 'type path\to\file.txt', 把檔案內容印出來就可以。