Laden...

Programm Remote über WMI starten

Erstellt von Axhalaisom vor 13 Jahren Letzter Beitrag vor 12 Jahren 8.196 Views
A
Axhalaisom Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
Programm Remote über WMI starten

Hallo zusammen,

momentan hänge ich an folgendem Problem, das ich versuche über WMI zu lösen:

Ein Benutzer meldet sich an einem Terminalserver an und startet dort eine Verknüpfung. Mit der Verknüpfung wird ein Client gestartet, der sich auf einem anderen Server mit den Daten des angemeldeten Benutzers an einem Dienst anmeldet (domäne\benutzer + passwort).

Öffnet man die Eigenschaften der Verknüpfung, steht dort im Ziel "Pfad zu dem Programm" "Pfad der Konfigurationsdatei". In der Konfigurationsdatei steht, welcher Server auf welchem TCP Port von dem Client angesprochen werden soll.
In dem Client selbst lässt sich dann auch nachvollziehen, welche Benutzer gerade angemeldet sind.

Genau diese Konstellation versuche ich jetzt momentan über ein C# Programm abzubilden um zu testen, wie sich der Terminalserver mit n Benutzern verhält.

Wenn ich die Domäne und den Benutzernamen mit Passwort in den ConnectionOptions übergebe, bekomme ich die Fehlermeldung "Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT: 0x800706BA)".

Kennt jemand das Problem? Anbei noch der aktuelle Code:

                string remoteMachine = "Name des Computers";
            
                ConnectionOptions connOptions = new ConnectionOptions();
                connOptions.Username = "domäne\Benutzer";
                connOptions.Password = "Passwort";
                connOptions.Impersonation = ImpersonationLevel.Impersonate;
                connOptions.EnablePrivileges = true;

                ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", remoteMachine), connOptions);
                manScope.Connect();

                ObjectGetOptions objectGetOptions = new ObjectGetOptions();
                ManagementPath managementPath = new ManagementPath("Win32_Process");
                ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions);

                ManagementBaseObject inParams = processClass.GetMethodParameters("Create");

                inParams["CommandLine"] = @"""Pfad zu dem Programm"" ""Pfad der Konfigurationsdatei""";                
               
                ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);

                Console.WriteLine("Creation of the process returned: " + outParams["returnValue"]);
                Console.WriteLine("Process ID: " + outParams["processId"]);
                Console.ReadLine();

Über PSexec habe ich das gleiche auch versucht, darüber gehts. Gibt es die Möglichkeit von PSexec die Prozess ID zurückzubekommen, so dass ich den Prozess auch wieder abschießen kann?

Vielen Dank schonmal

I
1.739 Beiträge seit 2005
vor 13 Jahren

Spontan würde ich auf fehlende Rechte tippen.

A
Axhalaisom Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

Hatte ich zunächst auch getippt, das kann ich jetzt allerdings ausschließen.

Die Domäne muss separat in den ConnectionOptions angegeben werden:


connOptions.Authority = "ntlmdomain:Domäne";
connOptions.Username = "Benutzer";
connOptions.Password = "Passwort";

Trotz allem habe ich das Problem, dass der Prozess jetzt zwar startet, aber der Client verbindet sich trotzdem nicht mit dem Dienst auf dem anderen Server 😦

€dit: Das Problem ist nun klar:

Das Programm wird auf der Session 0 ausgeführt und dadurch nicht als der Domänenbenutzer ausgeführt.

Gibt es eine Möglichkeit Sessions auf dem Terminalserver anzusprechen, die dort momentan laufen und dort das Programm auszuführen?

A
Axhalaisom Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

Hat keiner eine Idee? 😦

Jeder Ansatz den ich habe, läuft darauf hinaus, dass ich mich auf die Sitzungen schalten müsste. Kennt jemand eine Möglichkeit dafür?

I
1.739 Beiträge seit 2005
vor 13 Jahren

Sorry auf welche Sitzungen willst du dich Schalten?
Auf die des aktiven Users? Wie Pompös!(da hat auch/gerade ein Admin nichts zu suchen).
Ausser zu beenden, und eine eigene aufzumachen... - Also Interaktive with Desktop...

A
Axhalaisom Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

Ja ich muss das auf aktiven Sitzungen starten. Es geht darum, dass ich mehrere Sitzungen mit verschiedenen Benutzern starten möchte und in deren Sitzungen ein Programm ausführen will.

Nur finde ich keine Möglichkeit in Sitzungen ein Programm zu starten, außer z. B. über psexec - i 11 (für die Sitzung 11). Darüber kann ich aber dann das Programm nur manuell schließen.

C
2 Beiträge seit 2011
vor 12 Jahren

Hi,

ich weiß ,der Thread ist schon etwas älter aber hier gehts genau um mein Problem.

Ich starte per Remote ein Programm (via WMI).

Das Programm hat eine GUI und wird in einer Consolen Session gestartet.
Ich benötige es aber auf der aktiven Session des angemeldeten Benutzers um ggf. per RemoteDesktopVerbindung, Buttons für eine Installation zu klicken...

Mit PsExec und der Option "-i" funktioniert es wie gewollt aber ich möchte es gern aus C# mit WMI machen.

kenn jemand dafür ein Lösung?

Vielen Dank vorab.
VG

C
1.214 Beiträge seit 2006
vor 12 Jahren

Das geht einfach nicht. Die meisten anderen, die sowas machen, installieren dann Remote einen Dienst, der das Programm lokal startet.

C
2 Beiträge seit 2011
vor 12 Jahren

Danke für die Info!
Einen Dienst zu installieren bzw. zu schreiben klingt erst mal etwas kompliziert.

Vielleicht geht ja auch folgendes:
Ein Programm, dass man auf den Target-Rechner kopiert und dieses per Remote startet.
Das Programm fungiert als eine Art Loader, der aus einer Consolen-Session ein Programm startet, das in der Desktop-Session laufen soll.

VG

C
1.214 Beiträge seit 2006
vor 12 Jahren

Wenn du so einen "Loader" schreiben kannst, vielleicht. Ich weiß nicht, ob das geht, könnts mir aber durchaus vorstellen (wenns ein Dienst kann, müsste es ein normales Programm auch können). Zum rumspielen könntest du z.B. wmic benutzen, nachdem du deinen Loader geschrieben hast.