【问题标题】:How-To install a service on Windows to be managed by any user如何在 Windows 上安装由任何用户管理的服务
【发布时间】:2013-04-10 10:24:05
【问题描述】:

我期待在 Windows(Windows 7 / Windows 8)上安装服务。

虽然该服务最初是由“管理员”安装的,但它的安装方式应该是该本地计算机上的任何用户帐户都可以启动/停止/重新启动它。

尝试将“登录身份”更改为网络服务,但没有帮助。

尝试了 Subinacl.exe,但由于安装程序的架构设计(不允许安装任何外部应用程序),这不可行。

问题很简单 -> 服务 A 由管理员安装,但应具有该机器上所有用户帐户的 FULL 权限。

此外,在安装时,事先不知道该计算机上可用的用户帐户数量和所有用户帐户。

【问题讨论】:

    标签: windows service uac


    【解决方案1】:

    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)"
    

    【讨论】:

      【解决方案2】:

      您可以使用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;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-08-27
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多