Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Process cmd starten und darin Netzlaufwerke verbinden, bevor der eigentliche Befehl ausgeführt wird
C#Gustl
myCSharp.de - Member



Dabei seit:
Beiträge: 36

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von C#Gustl am .
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 64
Herkunft: Eifel

beantworten | zitieren | melden

Hallo,

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

MfG
Yeti
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
chavez
myCSharp.de - Member



Dabei seit:
Beiträge: 252
Herkunft: Österreich

beantworten | zitieren | melden

ProcessStartInfo.RedirectStandardInput
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
C#Gustl
myCSharp.de - Member



Dabei seit:
Beiträge: 36

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
san-software
myCSharp.de - Member



Dabei seit:
Beiträge: 96

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo san-software,
Zitat
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
private Nachricht | Beiträge des Benutzers