【问题标题】:Install service with delphi?用delphi安装服务?
【发布时间】:2015-07-30 21:59:01
【问题描述】:

我想要一个小的可执行文件来安装我的服务,就像往常一样

path\servicename /install

我尝试在具有提升权限的程序中运行一个简单的 shellexecute,

ShellExecute(0, nil, 'cmd.exe','/C servicepath\servicename.exe /install', nil, SW_HIDE);

但服务没有安装。我不是 ShellEx 的专家,所以我怀疑我弄错了;请告诉我我的方式的错误,并可能提供正确的 shellexecute 行

【问题讨论】:

  • 为什么要通过cmd传递?直接执行你的服务...
  • ShellExecute(0, nil, 'servicepath\servicename.exe','/install', nil, SW_HIDE);
  • @J... 这对我有用,谢谢 :)
  • ShellExecute 是一个在 shell 中运行命令的函数——它可以执行您在控制台中手动执行的操作。如果您在控制台中,则不会通过以C:>cmd.exe ... 开头并启动另一个控制台并将命令作为参数传递来安装服务。参数 3 是您要运行的应用程序,参数 4 是参数。对于它的价值,虽然迂回,但如果您在命令 '/C "servicepath\servicename.exe /install"' 周围添加双引号,您在问题中的命令将起作用
  • ShellExecute 是错误的函数。使用创建过程。除非你需要 runas 动词。

标签: delphi service


【解决方案1】:

从代码安装服务的正确方法是调用服务控制管理器 (SCM) API。 Delphi 服务提供的 /install 参数对 SCM 进行“标准”调用,这通常不是大多数服务的最佳调用。今天,例如,很少有服务应该以 LocalSystem 权限运行,因为它太强大了。

【讨论】:

  • Delphi 服务使用TService.ServiceStartName 属性中配置的任何用户帐户自行安装,如果未指定帐户,则默认为 LocalSystem。这是 Microsoft 的默认设置,而不是 Delphi 的默认设置。服务作者有责任将服务配置为以必要的权限级别运行。
  • @Remy 服务安装程序而不是作者必须这样做。它需要创建一个新用户,或者选择一个现有用户。服务作者不能这样做。
  • @DavidHeffernan 默认的 Delphi 实现允许您在 .dfm 中“硬编码”ServiceStartName 属性的值。 (这也可以是“well-known”帐户名称,例如 'NT AUTHORITY\NetworkService'、'NT AUTHORITY\LocalService'、'.\LocalSystem'。)。服务作者可以编写代码来处理额外的命令行参数,让安装程序覆盖这个硬编码值。
  • @Lebeau:出于几个原因,我不喜欢自行安装并内置设置的服务。在 dfm 中更改它们或读取存储在那里的用户帐户密码几乎不需要。)我将从 TService 中删除整个自动安装功能,现在可以轻松地从命令行使用 SC.EXE 来管理服务。我同意 Heffernan 的观点,即安装人员负责执行服务安装和删除,Windows 默认设置不再足够安全,需要尽可能更改。
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多