Laden...

Process cmd starten und darin Netzlaufwerke verbinden, bevor der eigentliche Befehl ausgeführt wird

Erstellt von C#Gustl vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.241 Views
C
C#Gustl Themenstarter:in
36 Beiträge seit 2012
vor 11 Jahren
Process cmd starten und darin Netzlaufwerke verbinden, bevor der eigentliche Befehl ausgeführt wird

Hallo,

folgendes Vorhaben:

Ich erstelle mir gerade eine kleine C#-Anwendung womit ich über eine Batchdatei und eines verschlüsseltem Parameter eine Datei aufrufen kann via runas mit Passwortübergabe. Die Datei sollte dann auch von einem Netzlaufwerk gestartet werden können. Dazu muss ich vorab das Laufwerk über dem jeweiligen Benutzer (dann admin) verbinden.
Mein Gedanke ist, eine console mit dem user admin (mit passwort) zu öffnen. Dann dort die nötigen Laufwerke verbinden und dann die entsprechende Datei (Batch, Installationsprogramm,etc.) aus der console starten und nach Abschluss die console beenden.

Ich starte also eine console (jetzt ohne runas):


ProcessStartInfo startInfo = new ProcessStartInfo("cmd");
Process proc = Process.Start(startInfo);

Nun soll in der gestarteten console 5x net use x: \server\share
gemappt werden. Danach eine Datei gestartet die eben auf den Netzlaufwerken zugreifen will.

Doch wie sende ich jetzt zusätzliche Befehle zu dieser console?

Danke schonmal.

Gruß Gustl

64 Beiträge seit 2012
vor 11 Jahren

Hallo,

hilft dir das hier weiter?
Redirecting Input/Output of cmd.exe

MfG
Yeti

++Rekursion ++
(lat. , die) siehe Rekursion

C
252 Beiträge seit 2007
vor 11 Jahren
49.485 Beiträge seit 2005
vor 11 Jahren

Hallo C#Gustl,

warum erstellst du nicht eine kleine Batch-Datei, die die Netzlaufwerke verbindet und am Ende die eigentliche Batch-Datei aufruft?

Diese neue Batchdatei kannst dann einfach direkt starten

Process.Start ("connectAndExecute.cmd");

oder indirekt per cmd.exe

Process.Start ("cmd.exe", "/c connectAndExecute.cmd");

herbivore

C
C#Gustl Themenstarter:in
36 Beiträge seit 2012
vor 11 Jahren

Hallo, und erstmal danke für die Antworten, haben mir etwas weitergeholfen.

Ich habe es nun so lösen können:

Process p = new Process();
                  ProcessStartInfo psI = new ProcessStartInfo("cmd");
                  psI.UseShellExecute = false;
                  psI.RedirectStandardInput = true;
                  psI.RedirectStandardOutput = true;
                  psI.CreateNoWindow = false;
                  p.StartInfo = psI;
                  p.Start();
                  p.StandardInput.AutoFlush = true;
                  p.StandardInput.WriteLine("echo hallo");
                  p.StandardInput.WriteLine("echo %username%");
                  char[] bufferr = new char[10000];
                  int readr = 0;

                  Thread.Sleep(500);
                  while (p.StandardOutput.Peek() > 0)
                  {
                      readr += p.StandardOutput.Read(bufferr, readr, 10000);
                  }
                  Console.WriteLine(new string(bufferr).Remove(readr));
                  Console.ReadLine();

Allerdings kann ich diesen Prozess (cmd) so nicht über einen anderen Benutzer (Admin) starten (ohne das Passwort eingeben zu müssen). Ziel ist es ja, das das Passwort nicht eingeben werden muss.

Ich habe mir diese Klasse mal angesehen: RunAs Class

Dort kann ich über CreateProcessWithLogonW aus der advapi32.dll einen Prozess mit einem beliebigen Benutzer und Passwort starten. Allerdings finde ich dort keine ProcessStartInfo wo ich RedirectStandardInput auf true setzen kann und somit nachträglich noch befehle in der Konsole zu schreiben.

@herbivore: Das wäre eine Möglichkeit, allerdings müsste ich dafür erst eine Batch erstellen und nach der Ausführung wieder löschen. Da mehrere Benutzer darauf zugreifen könnten, könnte es vorkommen dass die Datei dann überschrieben wird, bzw. Zugriff verweigert wird. ist schwer zu erklären. Würde gehen, ist aber unschön. Wenn ich es nicht hinbekomme, werden die Netzlaufwerksverbindungen fest in einer Batch geschrieben.

Gruß Gustl

S
93 Beiträge seit 2008
vor 11 Jahren

Bei der von herbivore vorgeschlagenen Methode mit der Batchdatei kannst Du doch den Namen der Batchdatei selbst wählen.
D.h. Du erzeugst einfach einen Namen der Batchdatei, der eindeutig ist, zb. <Username>.bat oder eine Kombination as Username, Datum und Zeit.
Zur Sicherheit kannst Du ja abfragen, ob die Datei schon existiert, und dann generierst Du einen neuen Namen.

Du kannst Dir auch von Windows diese Arbeit abnehmen lassen. Es gibt Funktionen, die einen sicher noch nicht vorhandenen Namen erzeugen.

Es gibt da also einige Möglichketen.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo san-software,

D.h. Du erzeugst einfach einen Namen der Batchdatei, der eindeutig ist

dafür muss man gar nicht selber rumbasteln, sondern kann Path.GetTempFileName oder Path.GetRandomFileName verwenden.

herbivore