服务可以在Windows下做什么?

时间:2008-09-22 20:56:01

标签: windows windows-services

有没有人对XP下的Windows服务功能有很好的指导?特别是,我试图找出当作为服务运行的程序试图打开窗口时会发生什么,但是没有获得与桌面交互的权限。

基本上,我有一个GUI应用程序,它应该能够作为长期后台处理服务运行。在进行后台处理时重写程序以不显示GUI元素是一项重大工作,因此我想看看是否只有一种方法可以忽略UI元素。它现在有点工作,只要没有打开太多的窗口。我想弄清楚我可能遇到的限制。理想情况下,会有一个MSDN页面讨论这个,但我还没有找到一个好运。

5 个答案:

答案 0 :(得分:8)

通常,服务应设计为没有任何可见的UI。服务的整个要点是在没有UI的情况下在后台运行,无人值守。 (想想SQL Server,IIS等)

在大多数情况下,如果需要GUI,单独的应用程序将控制服务的操作。 (继续我刚刚提到的示例,SQL Server Management Studio,IIS管理器等)这些单独的应用程序配置和操作服务(有时,如果需要,还可以退回服务)。

如果您的服务需要偶尔使用UI,并且说UI无法与控件应用程序隔离,那么您可能应该重新考虑使用服务的事实。也许驻留在系统通知区域中的UI应用程序是正确的模式? (例如,Windows Live Communicator。)

答案 1 :(得分:2)

Microsoft Windows中的服务是在计算机运行操作系统时运行的程序。它不需要用户登录。需要服务来执行与用户无关的任务,例如目录复制,进程监视或对网络上其他计算机的服务,例如对Internet HTTP协议的支持

通常它被实现为在后台运行的控制台应用程序,并执行不需要用户交互的任务。

可以通过“服务”小程序配置已安装的服务  Windows 2000 / XP中的Control Panel --> Administrative Tools

可以将服务配置为在操作系统启动时自动启动,因此您无需在系统重新启动后手动启动每个服务。

  1. Creating a Simple Service - MSDN Article
  2. Writing Windows Services Made easy - Code Project Article
  3. Five Steps to Writing Windows Services in C - DevX Article

答案 2 :(得分:1)

如果您考虑最终迁移到较新的操作系统(如Vista或Server 2008),您会发现根本无法授予服务权限以与桌面进行交互。因此,从向前兼容性的角度来看,您应该将服务设计为不需要它。

答案 3 :(得分:1)

如果选中“允许服务与桌面交互”属性(MMC - >服务属性 - >“登录”选项卡),则Windows XP中的服务可以与桌面交互。通过执行以下操作也可以这样做:

hWinstation = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hWinstation);
hDesktop = OpenDesktop("default", 0, FALSE, MAXIMUM_ALLOWED);
SetThreadDesktop(hDesk);

但请注意,在Windows XP中显示来自服务流程的UI几乎总会导致安全问题(请参阅Shatter attack)。您应该尝试从服务中分离应用程序的UI部分。

答案 4 :(得分:0)

通常服务无权写入窗口站和桌面,因此会失败;即使运行加载user32.dll的应用程序也会失败,因为user32具有想要与窗口站通信的初始化代码,除非服务以管理员身份运行,否则无法访问它。