尝试停止C#Windows服务时拒绝访问

时间:2011-07-08 13:09:57

标签: c# .net web-services visual-studio-2005 iis-5

我使用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服务器中发布了此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服务?

非常感谢您的帮助。

提前致谢, 瑜珈

1 个答案:

答案 0 :(得分:5)

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

这种情况的简单但未经推荐的方式是为IUSER帐户提供更多权限。只是尝试将此帐户添加到管理员组,bam!,它将起作用(但也会引入一些潜在危险的安全漏洞)。
更好的方法是制作允许通过IIS管理的特定Windows服务的显式列表,并将其各自的服务安全描述符设置为IUSER帐户(或其他帐户) /为该场合创建的组)可以根据需要启动和/或停止它们 实现这种方法的困难在于,据我所知,没有GUI或直观的管理工具来检查和更改服务的安全描述符:您需要使用SD并“学习”SDDL语言。以下是一些指示