无法在计算机上打开服务名称服务'。'。使用c#以编程方式启动Windows服务时出错

时间:2014-02-27 13:44:26

标签: c# winforms windows-services

我已经制作了一个Windows服务并将其安装在我的系统上。现在根据我的要求,我必须使用Windows窗体应用程序中的按钮单击启动和停止此Windows服务。 这是我的代码..

public partial class Form1 : Form
{
    string svcStatus;
    ServiceController myService;

    public Form1()
    {
        InitializeComponent();

        myService = new ServiceController();
        myService.ServiceName = "ServiceName";
        svcStatus = myService.Status.ToString();
    }


    private void button1_Click(object sender, EventArgs e)
    {
        if (svcStatus == "Stopped")
        {
            myService.Start();   // START the service if it is already Stopped

            string svcStatusWas = "";  
            while (svcStatus != "Running")
            {
                if (svcStatus != svcStatusWas)
                {
                    Console.WriteLine("Status: " + svcStatus);
                }

                svcStatusWas = svcStatus;

                myService.Refresh();
                svcStatus = myService.Status.ToString();
            }
            Console.WriteLine("Service Started!!");
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (svcStatus == "Running")
        {                
            myService.Stop();   // STOP the service if it is already Running

            string svcStatusWas = "";   
            while (svcStatus != "Stopped")
            {

                svcStatusWas = svcStatus;

                myService.Refresh();    
                svcStatus = myService.Status.ToString();
            }
            Console.WriteLine("Service Stopped!!");
        }
    }     
}

}

我收到错误“无法在计算机上打开Servicename服务。”。在这一行myService.Start();

请帮帮我。

2 个答案:

答案 0 :(得分:1)

如果您在XP计算机上运行或在Visual Studio的调试器下运行,这可能不是问题,但只有在Windows 7计算机上部署程序时才会看到错误:

  

无法打开< servicename>计算机服务'。'。

这很可能是因为Vista发生了关于用户帐户控制的权限更改。

如果您尝试以管理员身份运行应用程序并且未发生此问题,则可以验证这确实是导致问题的原因。

要启动或停止Windows服务,您需要运行具有管理权限的C#程序。

这可以手动完成,右键单击应用程序,然后单击“以管理员身份运行”

或者,如果您在解决方案资源管理器中项目的Properties文件夹中的app.manifest文件中添加以下代码,则可以通过将程序设置为始终以管理方式运行来以编程方式完成此操作:

 <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
 <security>
 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
 <!-- UAC Manifest Options
  If you want to change the Windows User Account Control level replace the 
  requestedExecutionLevel node with one of the following.

 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
 <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

  If you want to utilize File and Registry Virtualization for backward 
  compatibility then delete the requestedExecutionLevel node.
 -->
 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
 </requestedPrivileges>
 <applicationRequestMinimum>
 <defaultAssemblyRequest permissionSetReference="Custom" />
 <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
 </applicationRequestMinimum>
 </security>
 </trustInfo>
</asmv1:assembly>

您可以在此处找到有关创建和嵌入应用程序清单(UAC)的更多信息: https://msdn.microsoft.com/en-us/library/bb756929.aspx

答案 1 :(得分:-1)

Pranav,您需要以管理员权限运行您的应用程序。如果以管理员身份运行Visual Studio,则应用程序应在调试模式下正常运行。

当您部署应用程序时,您可以默认以管理员模式运行它,或者为应用程序分配适当的权限以使其能够启动和停止特定服务(我相信这是在命令行上完成的) 。我刚刚做过这个,快速的谷歌搜索会帮助你。