当前位置:   article > 正文

搞个Windows服务程序_安装因缺少 serviceprocessinstaller 而失败。serviceprocessin

安装因缺少 serviceprocessinstaller 而失败。serviceprocessinstaller 必须是安

windows服务程序方便,可以自动启动,也不受登录用户影响。没有界面,不大方便,但也有好处,眼不见心不烦。


说说它怎么安装:


1、添加一个项:安装程序类



2、在这个安装程序页面上添加两个组件ServiceInstaller,ServiceProcessInstaller,并设置

3、编译好的exe要用InstallUtil.exe来进行安装。

installUtil.exe为windows自带,搜一下就能得到。

命令格式为:installutil ***.exe

这里记得待安装的服务程序一定要写全称,就是要带后缀。


代码部分,要在program写一点东西才能启动:

  1. using System.ServiceProcess;
  2. class Program
  3. {
  4. static void Main(string[] args)
  5. {
  6. ServiceBase[] ServicesToRun;
  7. // 同一进程中可以运行多个用户服务。若要将
  8. // 另一个服务添加到此进程中,请更改下行以
  9. // 创建另一个服务对象。例如,
  10. //
  11. // ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
  12. //
  13. ServicesToRun = new ServiceBase[] { new Catch() };
  14. ServiceBase.Run(ServicesToRun);
  15. }
  16. }


安装的时候,如果提示

“安装因缺少 ServiceProcessInstaller而失败”,

可以改   this.Installers.AddRange(new System.Configuration.Install.Installer[] {this.serviceInstaller1,this.serviceProcessInstaller1});  少了“this.serviceProcessInstaller1”


4、ACCOUNT

ServiceProcessInstaller.Account

一般都是LocalSystem。如果指定为USER,则安装的时候需要指定账户名和密码。

注意安装的时候,填写账户名称时,即使是本机的账户,也应该带有域信息,格式是 .\UserName

密码是必须的,如果账户没有密码,也需要设置一个再安装,否则失败。


但是指定这个ACCOUNT似乎没有多大意义。比如说想满足这种需求:这个服务只在某个WINDOWS账户下使用,是办不到的。WINDOWS服务与普通应用程序不同,其所处的环境自成体系。好比你在服务里用 Environment.User,永远都是得到 SYSTEM 或是你指定的这个ACCOUNT,根本无法得知当前登录WINDOWS的账户是谁。


5、服务中显示窗体

从网上照抄的代码

  1. #region Form
  2. void FormShow()
  3. {
  4. if (Form1.IsDirty)
  5. {
  6. return;
  7. }
  8. GetDesktopWindow();
  9. IntPtr hwinstaSave = GetProcessWindowStation();
  10. IntPtr dwThreadId = GetCurrentThreadId();
  11. IntPtr hdeskSave = GetThreadDesktop(dwThreadId);
  12. IntPtr hwinstaUser = OpenWindowStation("WinSta0", false,33554432);
  13. if (hwinstaUser == IntPtr.Zero)
  14. {
  15. RpcRevertToSelf();
  16. return ;
  17. }
  18. SetProcessWindowStation(hwinstaUser);
  19. IntPtr hdeskUser = OpenDesktop("Default", 0, false, 33554432);
  20. RpcRevertToSelf();
  21. if (hdeskUser == IntPtr.Zero)
  22. {
  23. SetProcessWindowStation(hwinstaSave);
  24. CloseWindowStation(hwinstaUser);
  25. return ;
  26. }
  27. SetThreadDesktop(hdeskUser);
  28. IntPtr dwGuiThreadId = dwThreadId;
  29. Form1 f = new Form1();
  30. System.Windows.Forms.Application.Run(f);
  31. dwGuiThreadId = IntPtr.Zero;
  32. SetThreadDesktop(hdeskSave);
  33. SetProcessWindowStation(hwinstaSave);
  34. CloseDesktop(hdeskUser);
  35. CloseWindowStation(hwinstaUser);
  36. }
  37. [DllImport("user32.dll")]
  38. static extern int GetDesktopWindow();
  39. [DllImport("user32.dll")]
  40. static extern IntPtr GetProcessWindowStation();
  41. [DllImport("kernel32.dll")]
  42. static extern IntPtr GetCurrentThreadId();
  43. [DllImport("user32.dll")]
  44. static extern IntPtr GetThreadDesktop(IntPtr dwThread);
  45. [DllImport("user32.dll")]
  46. static extern IntPtr OpenWindowStation(string a,bool b,int c);
  47. [DllImport("user32.dll")]
  48. static extern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags,
  49. bool fInherit, uint dwDesiredAccess);
  50. [DllImport("user32.dll")]
  51. static extern IntPtr CloseDesktop(IntPtr p);
  52. [DllImport("rpcrt4.dll", SetLastError=true)]
  53. static extern IntPtr RpcImpersonateClient(int i);
  54. [DllImport("rpcrt4.dll", SetLastError=true)]
  55. static extern IntPtr RpcRevertToSelf();
  56. [DllImport("user32.dll")]
  57. static extern IntPtr SetThreadDesktop(IntPtr a);
  58. [DllImport("user32.dll")]
  59. static extern IntPtr SetProcessWindowStation(IntPtr a);
  60. [DllImport("user32.dll")]
  61. static extern IntPtr CloseWindowStation(IntPtr a);
  62. #endregion

其中

Form1 f = new Form1();

就是要显示的窗体。

同时,服务这里要勾上 “允许服务与桌面交互”。方法是鼠标右键这个安装好的服务,属性,登录。好像代码里也可以设置。

但是这种方式,XP下还可以,WIN7下就比较尴尬,系统不是直接出来这个窗体,而是出来一个警告消息,交互式服务检测,问你要不要看一下这个消息。要看的话,才有这个窗体出来。



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/981530
推荐阅读
相关标签
  

闽ICP备14008679号