2012-12-03 28 views
7

我已经创建了一个Windows应用程序。当我手动执行我的可执行文件时它工作正常,但是当我使用Windows服务运行我的exe时,它显示提供失败错误。我正在使用实体框架。实体框架有任何问题吗?Exe文件没有从我的Windows服务与数据库连接运行?

这里是我的代码:

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

我检查我的web服务和打印异常消息给我的记事本,发现了这个错误:

The underlying provider failed on Open.

但运行时,我只得到这个错误作为Windows服务。如果我手动运行我的exe,它工作正常。有没有必要在Windows服务中添加引用?

+2

尝试看到窗口logs.windows服务在这里写了例外 – Frank59

+0

是的,我发现我的Windows日志中的错误描述,但我怎么能解决这个问题。 –

+0

你可以在你的文章中添加错误描述吗? – Frank59

回答

1

我也通过windows服务启动我的应用程序。看看我的代码可以帮助你

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

} 

将下面的代码在你的方法

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 
    } 

这将创建在当前用户帐户的过程。此代码已启动并正在运行文件。

我希望这将帮助!欢呼!

+0

无法获取windowsapi的命名空间? –

+0

你现在可以得到!我编辑了答案:-) –

+0

我检查我的Web服务并将异常消息打印到我的记事本中,发现此错误:“底层提供程序在打开时失败。”但只有当我使用窗口服务时才会出现此错误。如果我手动运行我的exe文件,其工作正常 –

相关问题