如何在.net中为Windows服务设置ACL?

我有一个服务,我需要能够启动和停止一个button。 我在一个单独的程序中使用一个ServiceController,当我以pipe理员身份运行这个单独的程序时,一切都按预期工作。 不过,我需要能够像任何人一样控制这项服务。 我如何设置我的服务的权限,以便每个人都可以完全控制它? 这需要以编程方式作为服务的一部分或安装。 这是一个用vb.net写的本地服务。

Solutions Collecting From Web of "如何在.net中为Windows服务设置ACL?"

你有几个选择:

1)您可以要求您的应用程序以管理员身份运行。 每次启动应用程序时,系统都会提示您使用UAC(在Windows 7和Vista上),您的应用程序将升级到所需的级别。

以管理员身份运行

2)当需要停止和启动服务时,您的应用程序可以请求提升。 这将通过启动另一个更高级别的应用程序来完成,而另一个应用程序将执行实际的启动和停止。

如何仅在需要时提升权限?

3)首选,恕我直言 – 你应该建立你的服务运行所有的时间,但只是没有做任何事情,而不是通过TCP / IP,命名管道或其他通讯机制来侦听请求。 然后,您的服务可以启动或停止执行实际工作的线程。

4)您可以修改服务权限。 这里有一些帖子提供了一些关于这方面的信息(我仍然更喜欢选项3):

从非管理员用户帐户启动/停止Windows服务

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(第三个链接)与您的安装捆绑在一起,则可以使用它来为您设置权限。 我不知道这样做是否有任何许可证含义。 或者,您可以使用他所粘贴的代码的变体。

我的代码是用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 (!GetmoduleeFileName(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; }