本港台最快开奖现场

本港台最快开奖现场

C++ windows 本地Service


发布日期:2019-06-29 23:41   来源:未知   阅读:

  不知道windows的Service怎么使用我在程序里写了一个ServiceMain()方法我以为服务点启动它就会启动那个exe了?结果不是我已经安装了一个服务并指定了路径我只想在系统启动时执行这个exe...

  不知道windows的 Service 怎么使用 我在程序里 写了一个ServiceMain()方法 我以为服务点启动它就会启动那个exe了? 结果 不是 我已经安装了一个服务并指定了路径 我只想在系统启动时 执行这个exe就好了 要怎么实现呢?谢谢大神

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  知道合伙人软件行家采纳数:18940获赞数:47039毕业于西北大学计算机网络技术专业,现在在西安电力学院进行网络推广维护工作!向TA提问展开全部以下是一些基本知识, 不得不耐下心去理解,这对程序理解和编写非常用帮助.

  首先Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

  服务是有状态的,当我们使用windows自带的服务管理程序sc.exe 查看服务状态时可以显示服务的当前状态,这个状态是由我们在程序代码中进行控制的。你最好在服务初始化的时候将服务设置为SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些状

  态是系统自定义的状态,可通过msdn查看其他状态。这个状态信息你会在sc.exe中看到。

  1.首先是main函数,由于windows服务不需要界面,所以大部分程序为win32控制台应用程序,所以程序主函数为main 而不是WinMain()。在主函数要做的主要工作就是初始化一个SERVICE_TABLE_ENTRY 分派表结构体,然后调用StartServiceCtrlDispatcher();这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中对应于你的服务的ServiceMain()函数。ServiceMain()函数将在下面提到。

  在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务

  表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化。我们进行如下赋值:

  SERVICE_ACCEPT_STOP消息,这是通过前面给servicestatus赋值设定的。 这样一个基本的服务程序就完成了。 本文结束的时候会附上如

  当服务程序需要使用某些功能时,由于用户的关系而受到限制,比如访问注册表的HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身份去进行操作,通常会创建一个进程来完成需要的功能。如果使用CreateProcess, 来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一个参数是HANDLE hToken,该参数通常应该用LogonUser来获得,但是LogonUser又需要用户名和用户密码,这样就很不现实。那应该怎么办呢?我想到了一个方法可以绕过LogonUser直接获得hToken。因为用户已经登陆,那么肯定有Shell(就是EXPLORER.EXE)运行了,我们可以通过遍历进程来取得Shell的hToken来运行进程。

  //以下是自己要写的代码的执行调用地方.开始任务循环了,你可以添加你自己希望服务做的工作

  //几种调用外部程序的方法,但除了RunProcess其他都是以system身份打开程序.