如何远程启动和停止服务

Posted

技术标签:

【中文标题】如何远程启动和停止服务【英文标题】:How can i start and stop a service remotely 【发布时间】:2016-09-01 13:36:25 【问题描述】:

这是我第一次在这里发帖,也是我第二次编码。因此,为了了解这一切是如何工作的,我尝试查找代码 sn-ps 并复制/粘贴它们,直到我的应用程序似乎可以运行。我以前写过一些批处理和 ps 脚本,但老实说,我更喜欢系统管理和硬件......直到现在!

我的项目是一个简单的 GUI 工具,用于在特定服务器上启动和停止 TeamViewer 服务。我想让它尽可能简单,直到我在同事的计算机上启动该应用程序以向他们展示如何使用它为止,它似乎可以工作。

我收到错误:System.InvalidOperationException: Der Dienst TeamViewer kann nicht auf dem Computer MYSERVERNAME geöffnet werden。 ---> System.ComponentModel.Win32Exception: Zugriff verweigert,这显然与用户权限有关。所以我用谷歌搜索了很长一段时间关于模拟和 WMI 服务凭据的信息,但现在我被困住了,不得不向你们寻求帮助。

这是我的代码:

public partial class Form1 : Form
        
    public Form1()
    
        InitializeComponent();
    

    private void EIN_Click(object sender, EventArgs e)
    
        String svcName = "TeamViewer";
        String machineName = "MYSERVERNAME";
        var sc = new System.ServiceProcess.ServiceController(svcName, machineName);
        sc.Start();
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
    

    private void AUS_Click(object sender, EventArgs e)
    
        String svcName = "TeamViewer";
        String machineName = "MYSERVERNAME";
        var sc = new System.ServiceProcess.ServiceController(svcName, machineName);
        sc.Stop();
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped);
    

如果有人可以帮助我,我会很高兴!

p.s.:我的 Powershell 脚本工作起来就像一个魅力,但我想让它看起来更复杂:)

Edit1:我尝试停止/启动服务的服务器不是域的成员,但域的每个成员都应该能够停止/启动服务。

【问题讨论】:

您是否对远程计算机进行身份验证?如果每个拥有 IP 地址的人都被允许在远程机器上启动和停止服务,那就太糟糕了 如果您有一个可以运行的 powershell 脚本,您可以随时启动该脚本并让它运行。 您是否尝试以提升的权限运行您的应用程序? 请看看这个类似的问题:***.com/questions/34919343/… 那么您确定您在远程计算机上的用户权限是正确的,并且您以提升的权限在本地启动了吗? 【参考方案1】:

我找到了一个帖子,它帮助我完成了我的代码。可以找到here。

编辑1: 下面是代码现在的样子:

private void EIN_Click(object sender, EventArgs e)
    
      try
            

                #region Code to start the service

                string serviceName = "TeamViewer";
                string IP="actual-IP-address";
                string username ="actual-username";
                string password ="actual-password";

                ConnectionOptions connectoptions = new ConnectionOptions();
                //connectoptions.Impersonation = ImpersonationLevel.Impersonate;
                connectoptions.Username = username;
                connectoptions.Password = password;

                //IP Address of the remote machine

                ManagementScope scope = new ManagementScope(@"\\" + IP + @"\root\cimv2");
                scope.Options = connectoptions;

                //WMI query to be executed on the remote machine
                SelectQuery query = new SelectQuery("select * from Win32_Service where name = '" + serviceName + "'");

                using (ManagementObjectSearcher searcher = new
                            ManagementObjectSearcher(scope, query))
                
                    ManagementObjectCollection collection = searcher.Get();
                    foreach (ManagementObject service in collection)
                    
                        if (service["Started"].Equals(false))
                        
                            //Start the service
                            service.InvokeMethod("StartService", null);
                            //here i added a picture box which shows a green button when the service is started
                            pictureBox1.Image = Properties.Resources._120px_Green_Light_I_svg;
                      

                    
                

       #endregion

            
            catch (NullReferenceException)
            

            
    

【讨论】:

你应该在你的回答中包含这篇文章的要点——谁保证将来这个链接的存在?此外,您应该在附加的问题中解决您对解决方案的任何疑虑,而不是将其包含在您的答案中。最后,我不知道你在和谁说话不过你…… @Andreas Niedermair 感谢您的指示。我正在与评论我的问题的人交谈,因为我认为他们试图帮助我解决我的问题非常好。 我不得不硬编码用户名和密码,我认为这是不好的做法?你怎么看?

以上是关于如何远程启动和停止服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同域中的远程服务器上启动或停止IIS-8.5网站

通过 C# 代码在远程机器上启动和停止 IIS [关闭]

以编程方式在远程计算机上安装 Windows 服务

描述用命令如何启动,停止,重新启动和查看www服务?

linux下如何启动和停止sybase的服务

用xshell远程连接linux服务器,sh命令启动一个服务后,如果关掉xshell,这个服务也会跟着停止了