【问题标题】:Creating Windows Startup Services via REG or Command Line通过 REG 或命令行创建 Windows 启动服务
【发布时间】:2011-11-19 21:25:27
【问题描述】:

我有一个 Java 程序,它需要是一个以管理员身份运行的启动程序。如果不将其作为服务,似乎无法做到这一点。我试过使用HKLM\SYSTEM\CurrentControlSet\Services\Services\MyService。我尝试了类似于 Google Updater 使用的东西(他们使用 ...\Services\gupdate)。该过程没有开始(或者至少它立即停止,我无法确定。

我认为我使用注册表的方式有问题,因为该服务未显示在“服务”选项卡下的 msconfig.exe 中。它也没有显示在控制面板“查看本地服务”中(Windows 7,在开始菜单中搜索“服务”)

我尝试了much simpler approach found here。我用这些内容创建了一个.reg 文件。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService]
"Description"="My Service starts the Special Process."

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService\Parameters]
"Application"="C:\\Test\\MyProcess.cmd"

如有必要,我愿意考虑另一种命令行替代方案,但我喜欢注册表方法,因为如果我告诉我的安装程序添加某些注册表项,它会在卸载时自动删除这些项。

上面的.reg 文件是否有任何原因不会向msconfig 添加名为“MyService”的项目?

我编写的程序是用 Java 编写的。它没有 GUI 界面。

【问题讨论】:

  • 据我了解,您不是自己开发此程序,您有一个不是 Windows 服务的应用程序,因此您不应尝试将其安装为服务。如果我的假设是错误的,请澄清编辑问题。这是什么类型的应用程序(Windows 或控制台),你用什么语言编写的?

标签: windows service registry startup administrator


【解决方案1】:

可以通过编辑注册表来创建服务,但(应该很明显)您必须有一个与该服务关联的服务可执行文件Reg Add 将允许添加这些键/值。

系统必须在识别服务之前重新加载注册表,我发现重新启动可以完成工作。

  • 将密钥ServiceName 添加到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
  • 接下来在ServiceName 键中添加以下值:
    • DisplayName - REG_SZ - Sample Service
    • Description - REG_SZ - This Service is the Hello World Service!
    • ErrorControl - REG_DWORD - 1 (decimal)
    • ImagePath - REG_EXPAND_SZ - C:\ProgramData\Program\service_executable.exe
    • ObjectName - REG_SZ - Username_For_Execution(通常是本地系统)
    • Start - REG_DWORD - 2 (decimal)(这取决于所需的启动行为)
    • Type - REG_DWORD - 16 (decimal)

以下网站有助于解读各种值的含义:

只需在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 键内查找更多示例!

【讨论】:

    【解决方案2】:

    如果您想以管理员权限运行程序,还有另一种方法,而不是使用服务。

    您可以使用任务计划程序,for example

    还有命令行可用:SCHTASKS /create

    【讨论】:

      【解决方案3】:

      您无法通过操作注册表来创建服务。您也不能将任意应用程序作为服务运行。

      要从服务中运行任意程序,请使用Windows Server 2003 resource kit 中提供的 srvany.exe 服务。有关说明,请参阅KB137890。如果您想编写自己的服务,请参阅this

      要创建服务,您可以使用 sc 命令行工具,或 Windows Server 2003 资源工具包中的 instsrv.exe 工具。或者使用 CreateService Win32 API 函数。

      【讨论】:

      • 不确定这里是否赞赏 necro-ing(添加添加评论仍然可用),但根据 TenForums 上的lx07 是可能的(但那里的 OP 似乎没有管理它然而)。
      • @script'n'code,几年后添加评论是完全正常的,所以不用担心。 Lx07 使用的是 Windows PE,而不是 Windows 本身,并且他正在离线安装服务(来自与他正在操作的不同的 Windows 实例)所以这真的是苹果和橘子。我不认为在正在运行的系统上以这种方式安装服务是不可能的(前提是您不介意重新启动),但它不受支持,而且不明智。
      • ... 至于为什么它不适用于您链接中的 OP,很难说。他们可能只是忽略了某些事情,但也有可能被他们的防病毒软件阻止。据我所知,Windows 本身内置了一些对策。
      • 这可能是一种安全保护,是的,但我们可能永远无法了解事实。我还可以确认我得到的结果与 OP 相同。启用和不启用防病毒软件,无需重新启动,也无需加载和操作 install.wim 的 \Windows\System32\config\SYSTEM 注册表配置单元。
      • @script'n'code,可以使用dism /Add-Driver 和合适的.inf 文件在离线映像中安装服务。如果您正在安装 Windows,我相当确定可以通过使用 unattend.xml 中的 RunSynchronous 选项在“专业化”安装过程中安装服务,尽管 IIRC 上次我实际上需要这样做我仍在运行 Windows 7。
      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多