windows服務下無法啟動外部程式
做一個windows服務監聽服務,涉及到windows服務啟動外部程式的一個過程,但是調試測試發現,無法簡單的用process.start()這種方法,
原因是在vista和win7這樣的系統下,服務是運作在session 0,而基本上應用是運作在session 1,是以windows服務下無法啟動process.start()。
網上看到windows服務下無法啟動外部程式的原因,解決方案
1、在WinXP和Win2003環境中,安裝服務後,右鍵單擊服務“屬性”-“登入”頁籤-選擇“本地系統帳戶”并勾選“允許服務與桌面互動”即可.
2、在Win7環境中,由于微軟加強了權限管理,将此功能禁用,需要引用第三方dll,即Cjwdev.WindowsApi.dll
Cjwdev.WindowsApi.xml,dll下載下傳連結:http://pan.baidu.com/share/link?shareid=159544&uk=3288736938
解決方法:使用這樣一個第三方庫,Cjwdev.WindowsApi.dll,能夠從服務啟動外部程式;
public static void Openlocalexe(string path)
{
int _currentAquariusProcessID;
/*appStartpath設定為全路徑位址*/
string appStartpath = path;
IntPtr userTokenHandle = IntPtr.Zero;
ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle);
ApiDefinitions.PROCESS_INFORMATION procinfo = new ApiDefinitions.PROCESS_INFORMATION();
ApiDefinitions.STARTUPINFO startinfo = new ApiDefinitions.STARTUPINFO();
startinfo.cb = (uint)Marshal.SizeOf(startinfo);
try
{
ApiDefinitions.CreateProcessAsUser(userTokenHandle, appStartpath, "", IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startinfo, out procinfo);
if (userTokenHandle != IntPtr.Zero)
ApiDefinitions.CloseHandle(userTokenHandle);