如何使用ServiceController远程控制Windows服务?

21

我正在尝试控制安装在远程计算机上的Windows服务。 我正在使用 ServiceController 类。

我有这个:

<code>ServiceController svc =  new ServiceController("MyWindowsService", "COMPUTER_NAME");
</code>

使用这个方法,我可以获取Windows服务的状态:

string status = svc.Status.ToString();

但我无法控制Windows服务(通过执行svc.Start();svc.Stop();)。 我会收到以下异常:

在计算机'COMPUTER_NAME'上无法打开 Servicexxx 服务

这很正常,我想这可能与访问权限有关。但是怎么办呢? 我查看了谷歌,但没有找到我要找的内容。然而,我经常读到一些与模拟有关的内容,但是我不知道那是什么意思。

NB:本地计算机和远程计算机都运行Win XP Pro。

4个回答

11

3
这是一个不必要的安全漏洞。如果此应用程序的用户应该拥有访问权限,则他们应该具备凭据并以该用户身份登录。更重要的是,他们应该只拥有所属组分配的权限。这并不能解决问题,它是一种不安全的解决方法。请参考Hans Passant的答案和相关评论。 - majinnaibu
作为组织的测试人员,我们需要使用在Active Directory中定义的服务帐户和模拟身份来远程测试Windows服务。 - Su Llewellyn

8

启动和停止服务是一项高度特权的操作,通常只能由管理员使用。请确保您使用的用户帐户在目标机器上具有足够的特权。关于此问题可以在serverfault.com上提问。


0

我曾经遇到过同样的问题,但现在已经解决了。 尝试使用下面的代码:

 protected void Button4_Click1(object sender, EventArgs e)
    {
        //1º connect to remote computer
        ConnectionOptions connection = new ConnectionOptions();
        connection.Username = "USER NAME OF REMOTE COMPUTER";
        connection.Password = "PASS WORD OF REMOTE COMPUTER";
        connection.Authority = "NTLMDOMAIN:DOMINE NAME OF YOUR LAN";
        connection.EnablePrivileges = true;
        connection.Authentication = AuthenticationLevel.Default;
        connection.Impersonation = ImpersonationLevel.Impersonate;

        ManagementScope scope = new ManagementScope(
            "\\\\NAME OR IP OF REMOTE COMPUTER\\root\\CIMV2", connection);
        scope.Connect();
         // finsh connection
      
        ManagementObjectSearcher moSearcher = new ManagementObjectSearcher();
        moSearcher.Scope = scope;
        moSearcher.Query = new ObjectQuery("SELECT * FROM win32_Service WHERE Name ='SERVICE NAME IN REMOTE COMPUTER'");
        ManagementObjectCollection mbCollection = moSearcher.Get();

      // ServiceController svc = new ServiceController("Jenkins", "10.224.62.35");

      //namelbl.Text = svc.Status.ToString();

        foreach (ManagementObject oReturn in mbCollection)
        {
       // invoke start
        ManagementBaseObject outParams = oReturn.InvokeMethod("StartService", null, null);

        //invoke stop
        ManagementBaseObject outParams2 = oReturn.InvokeMethod("StopService", null, null);

        //get result
        string a = outParams["ReturnValue"].ToString();

       // get service state
         string state = oReturn.Properties["State"].Value.ToString().Trim();

        MessageBox.Show(state);// TO DISPLAY STATOS FROM SERVICE IN REMOTE COMPUTER
        }


       
        

    }//THE CODE ABOVE IS WRITER IN C#  I HOPE HELP SOME ONE. THANKS

0
为了解决这个问题,需要在远程计算机/服务器上给你的用户名赋予管理员权限,例如域名/用户名,这样你就能成功运行该程序包了。因为我之前也遇到过同样的问题,当我给自己授权后,远程服务器上的服务就可以访问了。

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