2013-04-09 61 views
1

我期待在Windows(Windows 7/Windows 8)上安裝服務。如何在Windows上安裝服務以供任何用戶管理

雖然該服務最初將由「管理員」安裝,但應該以這樣的方式進行安裝,即本地計算機上的任何用戶帳戶都可以啓動/停止/重新啓動它。

試圖改變「登錄爲」網絡服務,但沒有幫助。

嘗試Subinacl.exe,但由於安裝程序的體系結構設計(它不允許安裝任何外部應用程序),因此不可行。

問題很簡單 - >服務A由管理員安裝,但應該對該計算機上的所有用戶帳戶擁有完全權限。

另外,在安裝時,並不事先知道該機器上有多少用戶帳戶和哪些用戶帳戶可用。

回答

0

Kevin van Zonneveld在他的blog中描述瞭如何做到這一點。他提出的例子是允許所有通過驗證的用戶重新啓動Apache Tomcat服務:

sc GetKeyName "Apache Tomcat" 
# returns Tomcat5 

sc sdset Tomcat5 "D:AR(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;LCRPWP;;;AU)(A;;CCLCSWLOCRRC;;;IU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)" 
0

您可以使用SetSecurityInfoSetServiceObjectSecurity改變服務ACL。此代碼創建一項服務,然後設置ACL以允許任何交互式登錄的用戶啓動該服務:

wchar_t sddl[] = L"D:" 
    L"(A;;CCLCSWRPWPDTLOCRRC;;;SY)"   
     // default permissions for local system 
    L"(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)" 
     // default permissions for administrators 
    L"(A;;CCLCSWLOCRRC;;;AU)"     
     // default permissions for authenticated users 
    L"(A;;CCLCSWRPWPDTLOCRRC;;;PU)"   
     // default permissions for power users 
    L"(A;;RP;;;IU)"       
     // added permission: start service for interactive users 
    ; 

DWORD InstallService() 
{ 
    SC_HANDLE manager, service; 
    PSECURITY_DESCRIPTOR sd; 
    DWORD err; 

    wchar_t apppath[MAX_PATH + 2]; 

    // Note: because this is only called from main() which exits 
    // immediately afterwards, no attempt is made to close the 
    // handles generated. 

    if (!ConvertStringSecurityDescriptorToSecurityDescriptor(sddl, 
     SDDL_REVISION_1, &sd, NULL)) 
    { 
    err = GetLastError(); 
    printf("Error %u creating security descriptor.\n", err); 
    return err; 
    } 

    if (!GetModuleFileName(0, apppath, MAX_PATH + 1)) 
    { 
    err = GetLastError(); 
    printf("Error %u fetching module name.\n", err); 
    return err; 
    } 

    if (_wcsicmp(apppath + wcslen(apppath) - wcslen(exename), exename) != 0) 
    { 
    printf("Application name mismatch: %ls\n", 
     apppath + wcslen(apppath) - wcslen(exename)); 
    return ERROR_INVALID_FUNCTION; 
    } 

    manager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE); 

    if (!manager) 
    { 
    err = GetLastError(); 
    printf("Error %u connecting to service manager.\n", err); 
    return err; 
    } 

    service = CreateService(manager, 
    servicename, 
    displayname, 
    WRITE_DAC, 
    SERVICE_WIN32_OWN_PROCESS, 
    SERVICE_DEMAND_START, 
    SERVICE_ERROR_NORMAL, 
    apppath, 
    0, 
    0, 
    NULL, 
    NULL, 
    NULL); 

    if (!service) 
    { 
    err = GetLastError(); 
    printf("Error %u installing service.\n", err); 
    return err; 
    } 

    if (!SetServiceObjectSecurity(service, DACL_SECURITY_INFORMATION, sd)) 
    { 
    err = GetLastError(); 
    printf("Error %u setting service security.\n", err); 
    return err; 
    } 

    printf("Service successfully installed.\n"); 
    return 0; 
}