Ruby:gem win32-service:使用Admin权限创建服务

时间:2013-07-17 21:21:33

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

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

这段代码有效。

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

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

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

但是,当我尝试将Service.create:service_start_name设置为与我在服务中使用的完全相同的值(通过取消注释代码段中的行)时调用:password标签,它不起作用。此服务器是运行Windows 2008r2 Datacenter Edition的Amazon EC2服务器,并不是我所知道的任何Windows域的一部分(因为我启动了它)。

为了让这个Windows服务以管理员权限运行,我需要做些什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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