Exe file not starting from my windows service connecting to database?

I created a windows application. When I execute my executable file manually, it works fine, but when I start exe using the Windows service, it shows an error with an error. I am using Entity Framework. Is there a problem with Entity Framework?

Here is my code:

private void Threadfun() { try { System.Diagnostics.Process.Start(@"D:\V-Tec\bin\Debug\VibrantIndexerForm.exe"); if (System.IO.File.Exists(@"D:\VibrantIndexerSetup\MarcExport1.txt")) { } else { System.IO.File.Create(@"D:\VibrantIndexerSetup\MarcExport1.txt").Dispose(); } System.IO.File.WriteAllText(@"D:\VibrantIndexerSetup\MarcExport1.txt", System.DateTime.Now.ToString()); System.Threading.Thread.Sleep(100); } catch (Exception ex) { } } private void time_Elapsed(object sender, ElapsedEventArgs e) { m_thread = new System.Threading.Thread(new System.Threading.ThreadStart(Threadfun)); if (m_thread.IsAlive) { } else { m_thread.Start(); } } protected override void OnStart(string[] args) { if (time.Enabled == false) { time.Elapsed += new ElapsedEventHandler(time_Elapsed); time.Interval = 2000; time.Enabled = true; } } protected override void OnStop() { time.Enabled = false; } 

I checked my web service and printed an error message in my notebook and found this error:

Invalid base provider failed.

But I get this error only when working as a Windows service. If I run my exe manually, it works fine. Do I need to add links to Windows services?

+7
source share
1 answer

I also run my application through the Windows service. See if my code can help you.

  public class WindowsApi { [DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool WTSQueryUserToken(uint SessionId, ref IntPtr phToken); [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUserW", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CreateProcessAsUser([InAttribute()]IntPtr hToken, InAttribute(), MarshalAs(UnmanagedType.LPWStr)]string lpApplicationName, [InAttribute(), MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine, [InAttribute()] IntPtr pProcessAttributes, [InAttribute()] IntPtr lpThreadAttributes, MarshalAs(UnmanagedType.Bool)] bool bInheritHandles, uint dwCreationFlags, [InAttribute()] IntPtr lpEnvironment, [InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)] string pCurrentDirectory, ref STARTUPINFOW lpStartupInfo, ref PROCESS_INFORMATION lpProcessInformation); [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public uint nLength; public IntPtr lpSecurityDescriptor; [MarshalAs(UnmanagedType.Bool)] public bool bInheritHandle; } [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFOW { public uint cb; [MarshalAs(UnmanagedType.LPWStr)] public string lpReserved; [MarshalAs(UnmanagedType.LPWStr)] public string lpDesktop; [MarshalAs(UnmanagedType.LPWStr)] public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public ushort wShowWindow; public ushort cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } } 

Put the following code in your method

 try { IntPtr UserTokenHandle = IntPtr.Zero; WindowsApi.WTSQueryUserToken(WindowsApi.WTSGetActiveConsoleSessionId(), ref UserTokenHandle); WindowsApi.PROCESS_INFORMATION ProcInfo = new WindowsApi.PROCESS_INFORMATION(); WindowsApi.STARTUPINFOW StartInfo = new WindowsApi.STARTUPINFOW(); StartInfo.cb = Convert.ToUInt32(System.Runtime.InteropServices.Marshal.SizeOf(StartInfo)); string arguments = " nonGUI"; WindowsApi.CreateProcessAsUser(UserTokenHandle, pathToExe + "\\YourAppName.exe", arguments, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref StartInfo, ref ProcInfo); catch (Exception ex) { //Catch excpetion } 

This will create the process in the current user account. This code works and works.

I want this to help! greetings!

+1
source

All Articles