试图停止c# Windows服务时访问被拒绝

本文关键字:访问 拒绝 服务 Windows | 更新日期: 2023-09-27 18:01:38

我使用visual studio创建了一个c# web服务来停止windows服务'简单邮件传输协议(SMTP)',称为SMTPSVC。

下面是web方法:

[WebMethod]
public string StopService()
{
    String status = "";
    try
    {
        ServiceController scAlerter = new ServiceController("SMTPSVC");
        Console.WriteLine(scAlerter.DisplayName);
        Console.WriteLine(scAlerter.CanStop);
        scAlerter.Stop();
        Console.WriteLine("Service stopped");
        status = "STOPPED";
    }
    catch (Exception e)
    {
        Console.WriteLine("Exception caught here" + e.ToString());
        status = "Exception" + e.ToString();
    }
    return status;
}

我在IIS 5.1服务器上发布了这个web服务。当我调用该服务时,它抛出以下"访问被拒绝"异常

<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://y-square.org/">
    ExceptionSystem.InvalidOperationException: Cannot open SMTPSVC service on 
    computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied 
    --- End of inner exception stack trace --- at 
    System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
    at System.ServiceProcess.ServiceController.Stop() at Service.RestartService()
    in c:'Inetpub'wwwroot'RestartService'App_Code'Service.cs:line 38
</string> 

默认情况下,服务使用用户帐户IUSER_system-name,我已将该用户帐户添加到系统管理员组中,并将ASPNET用户帐户添加到管理员组中。

我能够成功地从c#独立程序停止/启动这个windows服务。

你能告诉我是什么问题吗?是否需要更改权限设置或IIS用户访问权限才能运行此程序?

还要让我知道这个c#服务将使用哪个用户帐户来停止Windows服务?

非常感谢你的帮助。

提前感谢,瑜珈

试图停止c# Windows服务时访问被拒绝

IUSER_machinename(以下简称为IUSER)帐户是一个相对有限的帐户,它的权限比来宾帐户大不了多少。它不允许启动和停止Windows服务,甚至不允许询问它们(获取它们的状态等)。
当在独立的exe上下文中运行时,上面的逻辑是成功的,因为底层帐户[可能]是您,可能是Administrators组的成员,或者无论如何是一个相当强大的帐户。

解决这种情况的简单方法(但不推荐使用)是给IUSER帐户更多的权限。试着将这个帐户添加到Administrators组,砰!,它可以工作(但也会引入一些潜在的危险安全漏洞)。
更好的方法是明确列出允许通过IIS管理的特定Windows服务,并将其单独的服务安全描述符设置为,以便IUSER帐户(或为这种情况创建的另一个帐户/组)可以根据需要启动和/或停止它们。实现这种方法的困难在于,据我所知,没有GUI或直观的管理工具来检查和修改服务的安全描述符:您需要使用sd并"学习"SDDL语言。这里有一些指针
  • MSDN服务自主访问控制列表编写者的最佳实践和指南
  • sc sdshow命令
  • sc sdset命令