如何在Windows上安装由任何用户管理的服务
我期待在Windows 7/Windows 8上安装服务 虽然该服务最初由管理员安装,但其安装方式应确保本地计算机上的任何用户帐户都可以启动/停止/重新启动该服务 尝试将登录更改为网络服务,但没有帮助 已尝试Subinacl.exe,但由于安装程序的体系结构设计不允许安装任何外部应用程序,因此不可行 问题很简单->管理员要安装的服务A,但应该对该计算机上的所有用户帐户具有完全权限如何在Windows上安装由任何用户管理的服务,windows,service,uac,Windows,Service,Uac,我期待在Windows 7/Windows 8上安装服务 虽然该服务最初由管理员安装,但其安装方式应确保本地计算机上的任何用户帐户都可以启动/停止/重新启动该服务 尝试将登录更改为网络服务,但没有帮助 已尝试Subinacl.exe,但由于安装程序的体系结构设计不允许安装任何外部应用程序,因此不可行 问题很简单->管理员要安装的服务A,但应该对该计算机上的所有用户帐户具有完全权限 此外,在安装过程中,还不知道该计算机上有多少用户帐户以及所有用户帐户 凯文·范·佐内维尔德(Kevin van Zo
此外,在安装过程中,还不知道该计算机上有多少用户帐户以及所有用户帐户 凯文·范·佐内维尔德(Kevin van Zonneveld)在他的文章中描述了如何做到这一点。他给出的示例是允许所有经过身份验证的用户重新启动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)"
您可以使用或更改服务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;
}