Programm aus einem Programm heraus auf einem Server starten



  • Hallo zusammen!

    Wahscheinlich bin ich hier im falschen Unterforum, da ich zwar mit Visual Studio (2005) arbeite, aber kein MFC verwende (es handelt sich um ein Windows Forms-Projekt, da konnte ich keine MFC-Bibliotheken einbinden).
    Falls es das falsche Forum ist, bitte ich euch meine Frage in das richtige Forum zu verschieben.

    Nun zu meinem eigentlichen Problem:
    Ich möchte aus meinem Programm heraus einen Optimierer auf einem Server starten. Das Programm selbst läuft nicht auf dem Server.

    Ich habe mir das gar nicht so schwierig vorgestellt, da ich auch schon einiges aus einer Datenbank auf dem Servr ausgelesen habe, um Daten zur Optimierung aufzubereiten.
    Im Visual Studio kann man unter Extras->Mit Server verbinden... anwählen, das habe ich auch gemacht. Jetzt wird mir der Server in einem Fenster mit Titel Server-Explorer angezeigt, auch einige Dienste u.a. RPC (wovon ich denke, dass es das ist, was ich brauche). Nur habe ich keine Ahnung, wie ich das jetzt verwenden kann.

    Ich dachte, dass ich über so einen RPC einfach einen Befehl absetzen kann (dass system() dafür nicht so super ist und ShellExecute() da die bessere Wahl ist, habe ich jetzt schon in einigen Foren gelesen).

    Könnt ihr mir da weiterhelfen?
    Schon mal vielen Dank im Voraus!

    P.S.: Ach ja, es ist sicher schon im Text aufgefallen, aber zur Sicherheit erwähne ich es nocheinmal: Ich bin ein ganz blutiger Anfänger....



  • Es geht nicht sehr einfach einen Process auf einem anderen Rechner zu starten.

    Wenn Du die passenden Rechte hast, dann geht es am "einfachsten" über WMI
    Siehe:
    http://www.google.de/search?hl=de&q=win32_process+start+remote
    http://msdn.microsoft.com/en-us/library/aa389388
    und das passende Beispiel in C/C++:
    http://msdn.microsoft.com/en-us/library/aa390421



  • Wow, das ging aber schnell!
    Vielen Dank, das gucke ich mir gleich mal an.

    Wozu ist denn dann dieser "Server-Explorer" im Visual Studio, wenn ich die Dienste, die er da auflistet nicht nutzen kann?





  • Aber was habe ich denn von einer Anzeige der Dienste, wenn ich eben diese nicht nutzen kann?

    Im namespace System::ServiceProcess gibt es die Klasse ServiceController, darin gibt es eine Methode GetServices(servername), die ein Array mit den verfügbaren Diensten des Servers aus dem Server-Explorer zurückgibt...

    Und im namespace System::Runtime::Remoting gibt es eine Klasse ObjRef, die laut Dokumentation "alle relevanten Informationen zur Generierung eines Proxys die für Kommunikation mit einem Remoteobjekt erforderlich sind" enthält.

    Ich dachte so ein Remoteobjekt wäre dann etwas wie ein OleDbConnection-Objekt, mit dem ich dann Befehle (ähnlich wie OleDbCommands) auf dem Server absetzen kann.



  • "OleDbConnection" baut eine Datenbannk-Verbindung auf... hat nix mit "ausführen von Programmen zu tun".



  • Ja, ich meinte ja auch, dass diese Klasse ObjRef analog zur OleDbConnection eine Verbindung zum Server aufbauen würde, und es dann etwas wie ein "RemoteCommand" analog zu einem OleDbCommand geben würde.



  • Hallo Jochen,

    ich habemir das Beispiel

    und das passende Beispiel in C/C++:
    http://msdn.microsoft.com/en-us/library/aa390421

    mal angeschaut, aber ich komme damit überhaupt nicht klar, nicht nur dass ich es nicht richtig verstehe, bei mir lässt sich der Code nicht einmal kompilieren.

    Beim ersten Versuch meldete der Compiler folgenden Fehler:

    [code]1>.\wmi_test.cpp(203) : fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen?
    

    Also habe ich stdafx.h eingefügt, je nach dem an welcher Stelle ich es eingefügt habe, kam ich dann unterschiedliche Fehlermeldungen - und ich habe extra ein neues, leeres Projekt geöffnet, da ich das Theater mit den header-Einbindungen ja schon zu genüge kenne.

    Hier nun die verschiedenen Fehlermeldungen meines Compilers:

    1>.\wmi_test.cpp(2) : error C2855: Die Befehlszeilenoption '/clr:pure' steht in Konflikt mit der vorkompilierten Header-Datei
    1>.\wmi_test.cpp(2) : warning C4651: '/D_M_CEE_PURE=001' für vorkompilierte Headerdatei, aber nicht für aktuelle Kompilierung angegeben
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(38) : error C3821: "va_list": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(38) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(40) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(41) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(42) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(62) : error C3821: "va_list": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(62) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(64) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(65) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(66) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(87) : error C3821: "va_list": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(87) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(88) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(89) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(90) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(107) : error C3821: "va_list": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(107) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(108) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(109) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\swprintf.inl(110) : error C3821: "_Arglist": Ein verwalteter Typ oder eine verwaltete Funktion kann nicht in einer nicht verwalteten Funktion verwendet werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\stdexcept(255) : warning C4382: Auslösen von "std::length_error": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\stdexcept(261) : warning C4382: Auslösen von "std::out_of_range": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\stdexcept(267) : warning C4382: Auslösen von "std::invalid_argument": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xlocinfo(77) : warning C4382: Auslösen von "std::runtime_error": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xlocinfo(87) : warning C4382: Auslösen von "std::runtime_error": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xlocinfo(99) : warning C4382: Auslösen von "std::runtime_error": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xlocale(345) : warning C4382: Auslösen von "std::runtime_error": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xlocale(364) : warning C4382: Auslösen von "std::runtime_error": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xlocale(1340) : warning C4382: Auslösen von "std::out_of_range": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xiosbase(280) : warning C4382: Auslösen von "std::ios_base::failure": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xiosbase(282) : warning C4382: Auslösen von "std::ios_base::failure": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\xiosbase(284) : warning C4382: Auslösen von "std::ios_base::failure": Ein Typ mit einem __clrcall-Destruktor oder einem Kopierkonstruktor kann nur in einem /clr:pure-Modul abgefangen werden.
    1>C:\Program Files\Microsoft Visual Studio\VC\include\comdef.h(21) : fatal error C1189: #error :  comdef.h header cannot be included under /clr:safe or /clr:pure
    

    Wenn ich dann in den Projekteinstellungen die CLR-Unterstützung auf clr/pure stelle bekomme ich folgende Meldung:

    1>C:\Program Files\Microsoft Visual Studio\VC\include\comdef.h(21) : fatal error C1189: #error :  comdef.h header cannot be included under /clr:safe or /clr:pure
    

    Wenn ich dann stdafx.h als letzten Header einbinde, erhalte ich folgende Fehlermeldungen:

    1>.\wmi_test.cpp(23) : error C2065: 'COINIT_MULTITHREADED': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(23) : error C3861: "CoInitializeEx": Bezeichner wurde nicht gefunden.
    1>.\wmi_test.cpp(26) : error C2065: 'cout': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(27) : error C2065: 'hex': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(27) : error C2065: 'endl': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(46) : error C2065: 'EOAC_NONE': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(38) : error C3861: "CoInitializeSecurity": Bezeichner wurde nicht gefunden.
    1>.\wmi_test.cpp(62) : error C2065: 'IWbemLocator': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(62) : error C2065: 'pLoc': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(65) : error C2065: 'CLSID_WbemLocator': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(68) : error C2065: 'IID_IWbemLocator': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(82) : error C2065: 'IWbemServices': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(82) : error C2065: 'pSvc': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(86) : error C2227: Links von "->ConnectServer" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(87) : error C3861: "_bstr_t": Bezeichner wurde nicht gefunden.
    1>.\wmi_test.cpp(101) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(112) : error C3861: "CoSetProxyBlanket": Bezeichner wurde nicht gefunden.
    1>.\wmi_test.cpp(127) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(128) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(140) : error C2065: 'IWbemClassObject': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(140) : error C2065: 'pClass': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(141) : error C2227: Links von "->GetObject" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(143) : error C2065: 'pInParamsDefinition': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(144) : error C2227: Links von "->GetMethod" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(147) : error C2065: 'pClassInstance': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(148) : error C2227: Links von "->SpawnInstance" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(156) : error C2227: Links von "->Put" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(161) : error C2065: 'pOutParams': nichtdeklarierter Bezeichner
    1>.\wmi_test.cpp(162) : error C2227: Links von "->ExecMethod" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(172) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(173) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(174) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(175) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(176) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(185) : error C2227: Links von "->Get" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(185) : error C3861: "_bstr_t": Bezeichner wurde nicht gefunden.
    1>.\wmi_test.cpp(195) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(196) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(197) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(198) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    1>.\wmi_test.cpp(199) : error C2227: Links von "->Release" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>        Typ ist ''unknown-type''
    

    Das hört sich für mich so an, als würden irgendwelche weiteren Header oder Bibliotheken fehlen. Bei dem MSDN-Link finde ich aber nicht, was ich noch bräuchte damit es läuft.

    Hättest du da noch einen Rat für mich, oder noch irgendeinen guten Link zu einem Tutorial? Ich versuche jetzt schon seit drei Tagen diesen Optimierer auf dem Server anzustarten und ich finde nichts im Netz, das mir weiterrhilft.

    Ich wäre für jede Hilfe sehr dankbar.



  • Hab es übersehen, dass Du ja C++/CLI verwendest... dann ist es IMHO einfacher die .NET-Variante zu verwenden:
    http://weblogs.asp.net/steveschofield/archive/2006/06/06/WMI---start-a-process-on-remote-machine-passing-credentials_2E00_.aspx



  • Vielen Dank!
    Gucke ich mir gleich mal an!



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Damit hat das super geklappt, vielen Dank.

    Kann ich so auch eine Textdatei auf einem der Laufwerke des Servers erstellen?
    Ich bin in der im Namespace System::Management in der msdn auf die WMI-Klasse Win32_LogicalDisk gestoßen, ist das die richtige? Ich finde dazu nämlich nur VB oder C#-Beispiele, in denen der freie Speicher oder so ausgelesen wird.

    Oder kann ich vielleicht sogar der Standard-stream-Funktion eine Server-Adresse mit Benutzernamen und Passwort mitgeben?

    Ich bin für alle Antworten dankbar!



  • Ach ja, ich habe auch schon Versucht der Create-Methode aus der Win32_Process-Class den "echo"-Befehl mitzugeben, wie man es in eine Kommandozeile schreiben würde, aber da kam als Rückgaewert 9: "Pfad nicht gefunden"


Anmelden zum Antworten