1. 程式人生 > >細數c#Windows服務定時啟動另一程式的一二坑

細數c#Windows服務定時啟動另一程式的一二坑

本文沒有程式碼,但有程式碼連線,如需要看程式碼的同學,請進門直走,謝謝!!

       前段時間公司要求我寫一個程式用於檢測公司的產品測試資料是否有漏,並定時啟動它。在網上看了下資料,完成定時啟動的大概有兩種方式:第一種方式、在程式中加一個Timer計時器,定時啟動你編寫的方法,執行你想要的結果;這種方法的優點是定時功能和你想要的執行功能在同一程式中,不需另寫程式啟用它,缺點是需要一直開啟程式,增加了人為誤操作的可能。第二種方式:將定時啟動程式放在Windows服務中,定時啟動被執行程式。優點:不用一直開著程式,定時啟動程式隱藏在Windows服務中,大大減少人為誤操作的可能。缺點:需要另寫程式了。為了避免人為的誤操作我選擇了第二種方案。

在網站找了一大堆解決方案,我照著 點選開啟連結三五下就寫好了一個Windows 服務,接著就是服務安裝點選開啟連結。一切都順風順水,幾十行程式碼寫就一個Windows服務,驚喜不驚喜,意外不以為,媽媽再也不用擔心我寫程式碼了。接下來就是見證奇蹟的時刻,服務安裝成功,接下來就是等待Windows服務挑動我的程式了。誒?設定的時間不是到了嗎,怎麼還是這麼靜悄悄?難道是我的程式有問題?我手動啟動程式,很正常啊。莫非是windows 服務沒有執行那段啟動程式的程式碼?我開始除錯服務點選開啟連結(解除安裝服務,改程式碼裡的執行時間,重新生成解決方案,安裝,啟動服務,除錯把服務新增到程序,設定斷點,等待時間到達)process 啟動程式程式碼被執行過,為什麼還是不行?難道是我process start 的程式碼有問題,把程式碼複製到一個新專案裡,執行。沒有問題啊,程式正常啟動啊。。。。糾結痛苦了好久,突然靈光一閃,我啟動被執行程式和服務啟動被執行程式的唯一區別是登入的使用者不同。我登入用的是User,而服務裡面登入用的是local system。在我被啟動的程式裡面,是要訪問公共盤的,user 是有賬號和密碼的,而local system 是沒有許可權的,於是我切換服務的使用者,將其改為user,解除安裝服務,重新生成解決方案,安裝,開啟服務,並在被啟動程式裡寫幾個log輸出到c盤txt文件。再次執行,發現程式已經執行,但是又出現了一個異常。異常來自 HRESULT:0x800A03EC,

What fuuuuuuuuuuuuuuck!這是什麼鬼,為什麼我手動啟動麼有問題,已新增到服務就出現問題。好吧,我待程式碼如初戀,又找問題原因。因為有了上一次的教訓,我判斷這次出現問題的原因可能也是許可權的原因,但是為什麼Excel也來捉弄我?我查看了Excel的許可權設定,三個使用者(local system,Administrator,user)都是完全控制,為什麼服務不可以?我終於找到了一種方案點選開啟連結,按著在服務裡的使用者設定啟動使用者許可權。再次啟動服務執行程式.OK!凡是打不敗你的,終將讓你強大。