从没有管理员权限的应用程序启动Windows服务(c ++)

Mis*_*r X 2 c++ windows service

我写了一个Windows服务(运行正常).现在我有一个单独的应用程序,我想从中启动此服务,但似乎没有管理员权限这是不可能的.

如何使用适当的解决方案看起来用户可以启动/停止服务(例如,从托盘或应用程序)

恕我直言,应用程序必须始终以管理员权限启动.

Har*_*ton 9

您只需更改服务对象的权限,最好在安装时同时更改.

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
  ;

PSECURITY_DESCRIPTOR sd;

if (!ConvertStringSecurityDescriptorToSecurityDescriptor(sddl, SDDL_REVISION_1, &sd, NULL))
{
   fail();
}

if (!SetServiceObjectSecurity(service, DACL_SECURITY_INFORMATION, sd))
{
   fail();
}
Run Code Online (Sandbox Code Playgroud)

我假设你已经打开了服务句柄.您需要WRITE_DAC权限.

如果您还希望非管理员用户能够停止服务,请添加WP权限,即

L"(A;;RPWP;;;IU)"                           
  // added permissions: start service, stop service for interactive users
Run Code Online (Sandbox Code Playgroud)

服务权限的SDDL代码可以在Wayne Martin的博客条目"非管理员的服务控制管理器安全性"中找到.