Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在.net中为Windows服务设置ACL?_.net_Windows_Vb.net_Service_Acl - Fatal编程技术网

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

如何在.net中为Windows服务设置ACL?,.net,windows,vb.net,service,acl,.net,Windows,Vb.net,Service,Acl,我有一个服务,我需要能够启动和停止一个按钮。我在一个单独的程序中使用ServiceController,当我作为管理员运行这个单独的程序时,一切都按预期运行。但是,我需要能够像任何人一样控制此服务。如何设置我的服务的权限,使每个人都能完全控制它?这需要作为服务或安装的一部分以编程方式完成。它是用vb.net编写的本地服务。您有几个选项: 1) 您可以要求应用程序以管理员身份运行。每次应用程序启动时,都会收到UAC(在Windows 7和Vista上)的提示,应用程序将提升到所需级别 2) 当需

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

您有几个选项:

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

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

3) 首选选项,IMHO-您应该构建始终运行的服务,但除了通过TCP/IP、命名管道或其他通信机制侦听请求之外,不做任何事情。然后,您的服务可以启动或停止执行实际工作的线程

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

更新


我根据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 (!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;
}

这是错误的。您可以更改服务ACL,这甚至不是特别困难。我不同意您的建议,即最好始终运行该服务。公平地说,这取决于OP没有提供的上下文,但作为一般规则,最好只在需要时启动服务。即使在空闲时,他们仍然在使用系统资源。问题是,这在很大程度上取决于上下文。虽然服务确实会消耗资源,但如果允许所有用户随意停止或启动服务,则存在相当大的风险。例如,启动或停止服务的应用程序可以假设服务正在运行,而实际上它已经通过其他方式停止。该服务还以提升的权限运行,这可能会带来额外的风险。