如何从C#启动/停止Windows服务

时间:2014-01-28 11:07:53

标签: c# asp.net service windows-services

我在我的应用程序中有三个用户角色。

  1. 超级管理员
  2. 管理
  3. 用户
  4. 我想仅为具有SuperAdmin用户角色的用户启动/停止服务。

    应用程序的需求是从ASP.NET Web应用程序启动/停止服务(或运行您要启动/停止的任何其他服务)。

2 个答案:

答案 0 :(得分:3)

使用Service Controll Manager启动/停止服务,而不是SHUTDOWN T-SQL动词。 SCM了解服务依赖性,并将正确关闭SQL Agent等依赖服务。此外,只有SCM可以启动服务。 SCM的托管API是ServiceController类。这解决了启动/停止服务的问题。

现在,关于模仿。为什么要关心?确定用户是否是“superadmin”(无论这意味着)是否是您的应用程序特定逻辑。在ASP.Net逻辑中进行身份验证和授权,然后授予应用程序池主体启动和停止服务所需的权限。见Service Security and Access Rights。请注意本地身份验证用户如何拥有连接到SCM和启动/停止服务的所有必要权限。

如果您确实选择模拟,那么它将落在模拟的上下文中以获得必要的权限。在Windows中没有“超级管理员”这样的概念,您将模拟Active Directory帐户,该帐户将具有或不具有连接到SCM和启动/停止服务的权限。

答案 1 :(得分:0)

我在上面的场景中做了什么,我必须使用c#从Asp.Net Web应用程序开始停止我的监控服务器。

为默认System.ServiceProcess Start(); Stop();个功能添加Refresh();

代码背后

using System.ServiceProcess;

private readonly ServiceController _monitoringServer = new ServiceController("MONITORING$SERVER");

// on login screen, I just saved the userRole of a Loggedin user in Session["userRole"]

// On pageload, refresh the sql service and gets its current status.
protected void Page_Load(object sender, EventArgs e)
{
    _monitoringServer.Refresh();
    GetServiceCurrentStatus();

    // if userRole of loggedIn user is SuperAdmin, then it will make the buttons visible to the user
    // else it will hide the buttons and show only status of SQL SERVER to admin user and standard/limited user
    if(Session["userRole"] == "SuperAdmin"){
        this.btnStartServer.Visible = true;
        this.btnStopServer.Visible = true;
    }
    else{
        this.btnStartServer.Visible = false;
        this.btnStopServer.Visible = false;
    }
    // You can further login to show hide Start Stop buttons
}

// Start Server Function
protected void btnStartServer_Click(object sender, EventArgs e)
{
    _monitoringServer.Refresh();

    if (_monitoringServer.Status == ServiceControllerStatus.Stopped)
    {
        _monitoringServer.Start();
        _monitoringServer.Refresh();
    }
    GetServiceCurrentStatus();
}

// Stop Server Function
protected void btnStopServer_Click(object sender, EventArgs e)
{
    _monitoringServer.Refresh();
    if (_monitoringServer.Status == ServiceControllerStatus.Running)
    {
        _monitoringServer.Stop();
        _monitoringServer.Refresh();
    }
    GetServiceCurrentStatus();
}

// Get Current Status of SQL Service Function
private void GetServiceCurrentStatus()
{
    try
    {
        _monitoringServer.Refresh();

        if (_monitoringServer.Status == ServiceControllerStatus.Running)
            this.txtServerStatus.Text = "Monitoring Server: Running";
        else if (_monitoringServer.Status == ServiceControllerStatus.Stopped)
            this.txtServerStatus.Text = "Monitoring Server: Stopped";
        else if (_monitoringServer.Status == ServiceControllerStatus.StartPending)
                this.txtServerStatus.Text = "Monitoring Server: Starting...";
        else if (_monitoringServer.Status == ServiceControllerStatus.StopPending)
            this.txtServerStatus.Text = "Monitoring Server: Stopping...";
        else if (_monitoringServer.Status == ServiceControllerStatus.Paused || _monitoringServer.Status == ServiceControllerStatus.PausePending)
            this.txtServerStatus.Text = "Monitoring Server: Pause";
        else
            this.txtServerStatus.Text = "Monitoring Server: Processing";
    }
    catch (Exception)
    {
        this.txtServerStatus.Text = "Monitoring Server: Not Installed";
    }
}

// Timer Function
protected void ServerTimer_OnTick(object sender, EventArgs e)
{
    _monitoringServer.Refresh();
}

客户端

// On client side, I just used a timer and sets its interval to 2 seconds (2000ms)
// after every 2 seconds it executes the ServerTimer_OnTick function which refreshes the status
<asp:Timer ID="ServerTimer" runat="server" Interval="2000" OnTick="ServerTimer_OnTick"></asp:Timer>