none
無法使用CmdExec來呼叫外部程式? RRS feed

  • 問題

  • Dear 各位專家:

    請教一個簡單但很奇怪的問題:

     

    在SQL Server 2000 的Enterprise Manager介面:

    管理/SQL Server代理程式/作業內,

    新增一個test"作業":然後在作業內新增一個"步驟",

    在"型別"選擇作業系統命令(CmdExec),最後在命令欄位內填入:

    F:\DBBackup\AutoFtp_ts_con.exe

     

    PS:AutoFtp_ts_con.exe是我寫的一支auto upload的執行檔, 在手動cmd下執行完全沒問題.

     

    另外, 我用簡單的Win內建指令測試, 如calc, 也都無法被呼叫起來.

     

    在event log的錯誤訊息Tongue TiedQL Server Scheduled Job 'test' (0x15F104D4DF22DA44901B197641D00F7F) - Status: 失敗 - Invoked on: 2007-06-15 18:52:10 - Message: 作業失敗。  這個作業由 使用者 Server\Administrator 叫用。要執行的最後一個步驟是步驟 1 (test)。.

    請問該如何解決, 感謝...

     

    PS: SQL Server Agent已啟動了.
    2007年6月15日 上午 11:04

解答

所有回覆

  • 請確認有指派適當的擁有者與權限給予該程式,以便順利執行該程式。這種基本的帳號安全管理,從資安的角度來看,是很正確的作法。

    參考資料:
    限制 SQL Server 服務的權限層級
    2007年6月15日 上午 11:47
    版主
  • 非常感謝大大專業又快速的回答...贊同與瞭解您的說明.

     

    但小弟不熟SQL Server 2000的介面, 所以不曉得要如何去操作您講的"指派適當的擁有者與權限給予該程式". 不知介面那裡進去可尋得? 謝謝...

     

    2007年6月20日 上午 01:45
  •  

    您好:

     

    我之前也有遇過這類的問題,但不確定是否能解決您的疑問。

    在SQL執行外部的程式時,必須將執行檔的權限設為Users群組可執行。

     

    以您的例子來看

    F:\DBBackup\AutoFtp_ts_con.exe

     

    在AutoFtp_ts_con.exe上點右鍵=>內容=>安全性=>將Users加入勾選可讀可執行

    若您是要將SQL的查詢出來的資料(如:xml)寫入該資料夾,也是要修正F:\DBBackup\的權限,將Users群組的修改寫入權啟用。

     

    另我正在查閱的資料則是. SQL Server透過.Net Framework核心,所執行的外部資料是以系統的哪一個帳號或群組權限執行的。

    待我查到或有前輩肯告知的話,我想才能給您明確的回答。

     

    2007年6月25日 上午 05:08
  • 感謝大大的回覆...

     

    仍失敗:

    以下列使用者的身分執行: Administrator。 這個步驟沒有產生任何輸出。  處理序 (Process) 結束碼 -1073741571。.  步驟失敗。

    2007年6月28日 上午 05:28
  •  

    您好

    可否將您F:\DBBackup\AutoFtp_ts_con.exe的內容完整貼出來。

     

    如果上述狀況都檢查過的話,比較有可能是路徑指定的問題。

    使用cmdexec去執行時,該執行檔的內容需要使用完整路徑。

    2007年6月28日 上午 11:06
  •  magicpopo 寫信:

     

    您好

    可否將您F:\DBBackup\AutoFtp_ts_con.exe的內容完整貼出來。

     

    如果上述狀況都檢查過的話,比較有可能是路徑指定的問題。

    使用cmdexec去執行時,該執行檔的內容需要使用完整路徑。

     

    先感謝大大的幫忙...

    您指的是要貼source code (我用delphi 開發的)?

     

    我在SQL Server介面裡是有寫完整路徑, 如下:

    F:\DBBackup\AutoFtp_ts_con.exe

     

    謝謝大家.

    2007年6月29日 上午 01:45
  •  

    您好.

     

    我做了一個簡單的測試,我在D:\test\做了一個test.bat,且放了一個檔為hlc2.xls

     

    test.bat內容如下

    --=====================

    copy hlc2.xls hlc3.xls

     

     

    --=====================

    而當我使用cmdexec進行執行D:\test\test.bat時,發現實際執行出來的如下

     

    這裡是輸出的執行細節

    C:\WINDOWS\system32>copy hlc2.xls hlc3.xls

    存取被拒。

    複製了         0 個檔案。

     

     

     

    所以我嘗試了修改了執行檔內容(由本來的相對路徑改為絕對路徑去執行)

    --=====================

     copy D:\test\hlc2.xls D:\test\hlc3.xls

     

     

    --=====================

     

    這裡是輸出的執行細節

    C:\WINDOWS\system32>copy D:\test\hlc2.xls D:\test\hlc3.xls

    複製了         1 個檔案。

     

    執行的目錄變成了 "C:\WINDOWS\system32>" 會不會是這個造成您程式運作的異常

    與平常的不同點,您直接執行那隻檔案時,該檔案是預設會在該目錄下作業,

    所以你可以使用相對目錄去操作您想要的資料複製。

     

    因此我希望確認您執行檔內的路徑

    是否也有相關問題,而且看起來那隻很像是使用FTP服務去自動丟檔。

    因此我也會很好奇是在哪一個環節會出問題。

     

    另.您可以在SQL Job執行cmdexec時,在Job的步驟內容內,選擇進階,將執行的細節輸出到一個檔案。

    我想會對查問題有一些幫助。

    2007年6月29日 上午 08:31
  • 嗯, 大大提供的測試方式值得一試, 或許可以找出問題的根源, 進而解決問題...

    非常感謝大大的熱心幫忙...我會給您評價.

    接著我們要再找時間測試一下, 有新的結果再與您回覆了...感恩.

     

    測試結果如下:

    A.在SQL Server上檢視該作業的記錄, 訊息如下:

    Step0 作業失敗。  這個作業由 使用者 host\Administrator 叫用。要執行的最後一個步驟是步驟 1 (test)。.

    Step1 以下列使用者的身分執行: host\Administrator。 這個步驟沒有產生任何輸出。  處理序 (Process) 結束碼 -1073741571。.  步驟失敗。 

     

    B.按照您說的, 我設定輸出細節至另一檔案, 竟發現輸出的檔案裡面是空的...

     

    如上...

    再次的謝謝...

    PS:單獨click去執行那支exe檔是OK的.

     

    2007年7月3日 上午 01:28
  • 試試這個方法

    CREATE PROCEDURE sp_AutoFtp AS

    DECLARE @Cmd VARCHAR(500)

    SET @Cmd = 'F:\DBBackup\AutoFtp_ts_con.exe '
    EXEC Master..xp_cmdshell @Cmd
    GO

     

    EXEC  sp_AutoFtp

    GO

    2007年9月27日 上午 06:27
  •  calven 寫信:

    試試這個方法

    CREATE PROCEDURE sp_AutoFtp AS

    DECLARE @Cmd VARCHAR(500)

    SET @Cmd = 'F:\DBBackup\AutoFtp_ts_con.exe '
    EXEC Master..xp_cmdshell @Cmd
    GO

     

    EXEC  sp_AutoFtp

    GO

     

    請問大大:

    您的方法要放在那邊才能執行? SQL Server在這個地方(Schedule)只能用執行檔.

    麻煩請教我一下, 詳細的做法...感謝...

    2007年9月28日 上午 06:03