windows服务下启动外部程序

1、缘由

公司要想做一个windows服务在检测自家软件的运行是否正常,如果不正常的话,就重新启动它,所以涉及到了windows服务启动外部程序的一个过程,但是进过测试,无法简单的用process.start(),这样的方式,主要原因是在vista和win7这样的系统下,服务是运行在session 0,而基本上应用是运行在session 1,所以即便是process.start()能够将外部程序启动起来,桌面上也是看不到的, 何况启动不起来呢~~;

2、解决方法:

在网上找到了好久,发现了这样一个第三方库,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);

                _currentAquariusProcessID = (int)procinfo.dwProcessId;
            }
            catch (Exception exc)
            {
                Interop.ShowMessageBox(exc.Message, "Comfirm");
            }
        }

你可能感兴趣的:(windows服务)