Exe 文件没有从我的 Windows 服务运行并具有数据库连接?

Posted

技术标签:

【中文标题】Exe 文件没有从我的 Windows 服务运行并具有数据库连接?【英文标题】:Exe file is not running from my Windows service with database connectivity? 【发布时间】:2012-11-20 15:02:48 【问题描述】:

我创建了一个 Windows 应用程序。当我手动执行我的可执行文件时,它工作正常,但是当我使用 Windows 服务运行我的 exe 时,它​​显示提供失败错误。我正在使用实体框架。实体框架有问题吗?

这是我的代码:

   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;  
    

我检查了我的网络服务并将异常消息打印到我的记事本,发现这个错误:

底层提供程序在打开时失败。

但我只在作为 Windows 服务运行时出现此错误。如果我手动运行我的 exe,它工作正常。是否需要在 Windows 服务中添加引用?

【问题讨论】:

尝试查看 windows logs.windows 服务在此处写入异常 是的,我在 Windows 日志中发现了错误描述,但我该如何解决。 这可能是系统权限问题。也许您应该检查该服务在哪个 Windows 帐户下运行(以及文件权限)。 是的,但服务在 SYSTEM 帐户中运行,我认为 :) 我检查了我的 Web 服务并将异常消息打印到我的记事本,发现此错误:“底层提供程序在打开时失败。”但是只有当我使用窗口服务时才会出现这个错误。如果我手动运行我的 exe,它的工作正常。 【参考方案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
      

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

我希望它会有所帮助!干杯!

【讨论】:

我检查了我的 Web 服务并将异常消息打印到我的记事本,发现此错误:“底层提供程序在打开时失败。”但是只有当我使用窗口服务时才会出现这个错误。如果我手动运行我的 exe,它的工作正常 我上面的评论可能会对你有所帮助,因为现在我发现我的 exe 正在运行但得到了这个异常,“底层提供程序在打开时失败。” 请尝试解决方案.. ***.com/questions/2475008/… 我尝试了上述解决方案,但仍然出现同样的错误:底层提供程序在打开时失败。 kromey.us/2011/06/…

以上是关于Exe 文件没有从我的 Windows 服务运行并具有数据库连接?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的exe文件没有在其他电脑上运行? [调试]

如何从我的 kivy 应用程序(Pyinstaller)获取 Windows 可执行文件?

nssm和AlwaysUp来包装exe文件为windows服务

2种方法教你,如何将exe注册为windows服务,直接从后台运行

从 Windows 服务启动 GUI 应用程序 - 窗口不出现

如何在Windows上配置并运行Nginx