我有一项服务,我需要能够使用按钮启动和停止。我在一个单独的程序中使用ServiceController,当我以管理员身份运行这个单独的程序时,一切都按预期工作。但是,我需要能够像任何人一样控制这项服务。如何设置我的服务权限,以便每个人都可以完全控制它?这需要以编程方式完成,作为服务的一部分或安装。它是用vb.net编写的本地服务。
答案 0 :(得分:2)
您有几个选择:
1)您可以要求您的应用程序以管理员身份运行。每次应用程序启动时,都会提示您使用UAC(在Windows 7和Vista上),您的应用程序将升级到所需级别。
Run .NET application as administrator
2)当需要停止并启动服务时,您的应用程序可以请求提升。它可以通过在更高级别启动另一个应用程序来执行此操作,而另一个应用程序将执行实际的启动和停止。
How to elevate privileges only when required?
3)首选项,恕我直言 - 您应该构建您的服务以便一直运行但除了通过TCP / IP,命名管道或其他通信机制侦听请求之外不做任何其他事情。然后,您的服务可以启动或停止执行实际工作的线程。
4)您可以修改服务权限。以下是一些提供相关信息的帖子(我仍然更喜欢选项3):
Start / Stop a Windows Service from a non-Administrator user account
http://msmvps.com/blogs/erikr/archive/2007/09/26/set-permissions-on-a-specific-service-windows.aspx
http://fstaal01.home.xs4all.nl/swsc-us.html
更新
我已根据Harry的评论更改了一些文字并添加了选项4。似乎有调整权限的方法。这些最初需要管理员权限,但如果您将swsc(第三个链接)等内容捆绑到您的安装中,则可以使用它来为您设置权限。我不确定这样做是否有任何许可证含义。或者,您可以使用他粘贴的代码的变体。
答案 1 :(得分:1)
我所拥有的代码是C语言,但它不应该太难以适应VB - 或者你可以把它放在DLL中。或者,您可以启动命令shell并使用sc sdset
命令。
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;
}