【问题标题】:Ruby: gem win32-service: Create a service with Admin privilegesRuby:gem win32-service:创建具有管理员权限的服务
【发布时间】:2013-07-16 15:16:19
【问题描述】:

我正在使用 win32-service gem 使用 Ruby(1.9.3-p429,MRI)创建 Windows 服务。

这个 sn-p 代码有效。

require 'rubygems'
require 'win32/service'

include Win32

SERVICE_NAME = 'myservice'

# Create a new service
Service.create({
  :service_name        => SERVICE_NAME,
  :service_type       => Service::WIN32_OWN_PROCESS,
  :description        => 'A custom service I wrote just for fun',
  :start_type         => Service::AUTO_START,
  :error_control      => Service::ERROR_NORMAL,
  :binary_path_name   => 'c:\Ruby193\bin\ruby.exe -C c:\ c:\myservice.rb',
  :load_order_group   => 'Network',
  #:service_start_name => 'Administrator',
  #:password           => 'adminpasswd',
  :display_name       => SERVICE_NAME
})

Service.start SERVICE_NAME

我遇到的问题是该服务需要以管理员权限运行,但调用此代码 sn-p 的实体作为本地系统帐户运行,这是默认权限。

我可以打开服务 GUI (services.msc) 并进入并停止服务,通过服务 (myservice) 属性的“登录”选项卡提高权限,并使用管理员/adminpasswd 作为用户/密码。然后它以足够的权限运行服务。

但是,当我尝试调用 Service.create 并将 :service_start_name:password 设置为与我在“服务”选项卡中使用的完全相同的值(通过取消注释代码 sn-p 中的行)时,它不会不行。该服务器是运行 Windows 2008r2 Datacenter Edition 的 Amazon EC2 服务器,不属于我所知道的任何 Windows 域(因为我启动了它)。

我需要做些什么不同的事情才能让这个 Windows 服务以管理员权限运行?

【问题讨论】:

    标签: ruby winapi elevated-privileges win32-service-gem


    【解决方案1】:

    Borodin 给了我这个答案的线索。当我回到服务 GUI 重新配置服务时,我注意到虽然我输入了“Administrator”作为用户名,但实际显示在面板中的用户名是“.\Administrator”。牢记鲍罗丁的评论,看来我可以指定“。”作为域。

    所以...实际工作的代码是:

    require 'rubygems'
    require 'win32/service'
    
    include Win32
    
    SERVICE_NAME = 'myservice'
    
    # Create a new service
    Service.create({
      :service_name        => SERVICE_NAME,
      :service_type       => Service::WIN32_OWN_PROCESS,
      :description        => 'A custom service I wrote just for fun',
      :start_type         => Service::AUTO_START,
      :error_control      => Service::ERROR_NORMAL,
      :binary_path_name   => 'c:\Ruby193\bin\ruby.exe -C c:\ c:\myservice.rb',
      :load_order_group   => 'Network',
      :service_start_name => '.\Administrator',
      :password           => 'adminpasswd',
      :display_name       => SERVICE_NAME
    })
    
    Service.start SERVICE_NAME
    

    【讨论】:

    • 我考虑过添加,但我相信只有 Administrators 是内置域的成员(您使用 .`), while the Administrator 选择帐户是默认域(计算机名称)的成员。很高兴已经清除了这一点。您也应该接受自己的答案:)
    • 我对 Windows 管理、角色、组、权限等一无所知。此解决方案有效,但根据您的评论,可能需要重新审视以更优雅地适应适当的管理框架。
    【解决方案2】:

    底层的CreateService Windows API 函数需要lpServiceStartName 字段上的帐户域,因此您可能需要将:service_start_name 字段设置为'domain\Administrator',其中帐户域通常是计算机名称。

    【讨论】:

    • 谢谢。这使我找到了实际的解决方案。
    • 也许你应该分享实际的解决方案来帮助其他寻找类似东西的人?
    • 你发帖时我正在这样做。伟大的思想都一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多