2016-09-01 3 views
4

Dies ist mein erstes Mal hier und mein zweites Mal Codierung. Um zu erfahren, wie das alles funktioniert, versuche ich, Code-Snippets nachzuschlagen und sie zu kopieren/einzufügen, bis meine Anwendung zu laufen scheint. Ich habe einige Batch- und PS-Skripte geschrieben, aber um ehrlich zu sein, ich bin mehr in Systemadministration und Hardware .... bis jetzt!Wie kann ich einen Dienst remote starten und stoppen

Mein Projekt ist ein einfaches GUI-Tool zum Starten und Stoppen des TeamViewer-Dienstes auf einem bestimmten Server. Ich wollte es so einfach wie möglich halten und es schien zu funktionieren, bis ich die Anwendung auf meinen Kollegen Computern startete, um ihnen zu zeigen, wie man es benutzt.

Ich bekomme den Fehler: System.InvalidOperationException: Der Dienst TeamViewer kann nicht auf dem Computer MYSERVERNAME geöffnet werden. ---> System.ComponentModel.Win32Exception: Zugriff verweigert, was offensichtlich mit Benutzerrechten zu tun hat. Also habe ich eine ganze Weile über die Identitätsnachweise und den WMI-Service gegoogelt, aber jetzt stecke ich fest und muss euch um eure Hilfe bitten.

hier ist also mein Code:

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); 
    } 
} 

ich sehr glücklich sein würde, wenn mir jemand helfen könnte!

ps: Mein Powershell-Skripts funktionierte wie ein Charme, aber ich möchte es anspruchsvollere aussehen :)

Edit1: Der Server, auf dem ich versuche, den Dienst zu beenden/starten ist kein Mitglied der Domäne, aber jeder Mitglied der Domäne sollte den Dienst stoppen/starten können.

+2

Haben Sie auf den entfernten Rechner authentifizieren? Es wäre sehr unangenehm, wenn jeder mit einer IP-Adresse Dienste auf einem Remote-Computer starten und stoppen könnte. –

+1

Wenn Sie ein Powershell-Skript haben, das funktioniert, können Sie das Skript immer einfach starten und es ausführen lassen. –

+1

haben Sie versucht, Ihre App mit erhöhten Rechten auszuführen? – swe

Antwort

4

Ich habe einen Beitrag gefunden, der mir geholfen hat, meinen Code zu vervollständigen. Es kann here gefunden werden.

Edit1: Hier ist, wie der Code wie jetzt aussieht:

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) 
      { 

      } 
    } 
+2

Sie sollten das Wesentliche dieses Beitrags in Ihre Antwort aufnehmen - wer garantiert die Existenz des gleichen Links in der Zukunft?Darüber hinaus sollten Sie alle Bedenken mit Ihrer Lösung in einer zusätzlichen ** Frage ** ansprechen, anstatt sie in Ihre Antwort aufzunehmen. Endlich habe ich keine Ahnung mit wem du sprichst * Trotzdem hast du ... * –

+0

@Andreas Niedermair Danke für die Anleitung. Ich spreche mit den Leuten, die meine Frage kommentieren, weil ich denke, dass es sehr nett von ihnen ist, die versuchen, mir mit meinem Problem zu helfen. – itrytocode

+0

Ich musste den Benutzernamen und das Passwort hart codieren, was ich für eine schlechte Übung halte? Was denken Sie? – itrytocode

Verwandte Themen