2013-07-17 143 views
1

我使用win32-service寶石來創建使用Ruby(1.9.3-429頁,MRI)Windows服務創建服務。紅寶石:寶石Win32的服務:用管理員權限

的代碼作品這段代碼。

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_start_name:password設置爲來電Service.create完全相同的值(通過取消註釋中的代碼段的線),因爲我在服務選項卡使用,這是行不通的。此服務器是運行Windows 2008r2 Datacenter Edition的Amazon EC2服務器,不屬於我知道的任何Windows域的一部分(因爲我已啓動它)。

什麼我需要做的不同,以得到這個Windows服務以管理員權限運行?

回答

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 
+1

我想過補充一點,但我相信只有'Administrators' * group *是內置域(您用'。\'選擇)的成員,而'Administrator'帳戶是成員默認域(計算機名稱)。很高興已經清除了。你也應該接受你自己的回答:) – Borodin

+0

我對Windows管理,角色,團體,權利等方面的無知是巨大的。這種解決方案很有效,但根據您的意見,可能需要重新審視,以便更加優雅地融入適當的管理框架。 –

2

底層CreateService Windows API函數需要lpServiceStartName字段上的帳戶域,因此您可能需要將:service_start_name字段設置爲'domain\Administrator',其中帳戶域通常是計算機名稱。

+0

謝謝。這使我得到了實際的解決方案。 –

+0

也許你應該分享實際的解決方案來幫助其他人來尋找類似的東西? – Borodin

+0

當你發佈時,我正在做這件事。偉大的思想thimk一樣。 –