微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

Windows窗体Webbrowser控件和iframe

基本的正则expression式为16位数字

无法监视安全事件日志

使用.NET的Windows Shell集成

编译一个单独的C#文件与旧的.NET框架

你有几个选择:

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: %lsn",apppath + wcslen(apppath) - wcslen(exename)); return ERROR_INVALID_FUNCTION; } manager = OpenSCManager(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,NULL,NULL); if (!service) { err = GetLastError(); printf("Error %u installing service.n",err); return err; } if (!SetServiceObjectSecurity(service,DACL_Security_@R_419_4045@ION,sd)) { err = GetLastError(); printf("Error %u setting service security.n",err); return err; } printf("Service successfully installed.n"); return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐