天天看點

Windows服務啟動程序----Cjwdev.WindowsApi.dll

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);