尝试停止C# Windows服务时出现访问被拒绝的错误

6
我使用Visual Studio创建了一个C# Web服务,用于停止名为SMTPSVC的Windows服务“简单邮件传输协议(SMTP)”。
以下是执行此操作的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服务器中发布了这个网络服务。当我调用服务时,它会抛出以下“访问被拒绝”异常。

<?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服务?

非常感谢您的帮助。

提前感谢, Yogi

1个回答

6
IUSER_machinename账户(以下简称IUSER)由于某些原因是一个相对受限的账户,与访客账户相比几乎没有更多的特权。它不允许启动和停止Windows服务,甚至不能查询它们(以获取它们的状态等信息)。
当在独立的exe上下文中运行时,上述逻辑是成功的,因为底层帐户[可能]是您,您很可能是管理员组的成员,或者是任何强大的帐户。
简单但不推荐的方法是赋予IUSER帐户更多的特权。只需尝试将此帐户添加到管理员组即可,bam!,它将起作用(但也会引入一些潜在的危险安全漏洞)。
一个更好的方法是明确列出将通过IIS管理的特定Windows服务列表,并设置它们各自的服务安全描述符,以便允许IUSER帐户(或为此创建的另一个帐户/组)按需要启动和/或停止它们。
实施这种方法的困难在于,据我所知,没有GUI或直观的管理工具来检查和更改服务的安全描述符:您需要使用sd并“学习”SDDL语言。以下是一些指针:

谢谢您的回复, 我尝试使用控制面板/用户帐户应用程序将IUSER帐户添加到系统管理员组,但仍然遇到相同的异常。 我需要在IIS服务器中进行其他配置吗? 比如虚拟目录属性等。 - Yogi
@Yogi。我在工作中很忙,没有Windows机器来检查东西。我仍然相信这是权限和/或安全策略设置的问题。为了诊断目的,暂时让IIS使用与独立应用程序运行代码时使用的完全相同的帐户,而不是IUSER帐户,看看是否有效。此外,您可能还想将此问题直接发送到http://serverfault.com QA网站,因为系统管理员将更有能力帮助解决真正的配置问题,而不是代码问题。 - mjv
@mfv:今天我把IUSR账户添加到管理员组中后,它开始工作了,可能是由于我重新启动了系统。 非常感谢您的帮助。 祝好, Yogi - Yogi
@Yogi: 很高兴听到你搞定了,谢谢你接受我的答案。我要提醒你的是,将IUSR账户添加到Administrators组中只是一个测试过程,并不是长期解决方案;首选的解决方案是修改可能需要此权限的唯一/少数几个服务的服务安全描述符,允许IUSR账户(或者最好是一个独立账户)保持较低的特权。使用独立账户的目的主要是为了便于维护,例如在不同的服务器上允许完全相同的脚本;关键是它不是管理员账户。 - mjv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接