Sendkeys verzögern für runas.exe

Meronax

Mitglied
Hallo Kollegen!

Ich habe folgendes Problem.
Ich möchte mir ein Programm schreiben, mit dem ich software unter Benutzerkonten installieren kann die über keine Adminrechte verfügen.

Dazu bietet sich natürlich an die runas.exe mit einzubeziehen.
Bei meinem Programm handelt es sich um eine art Sammlung aus verschiedenen Tools die ich immer wieder zur administration der user PC´s verwende. Dieses Tool ist im vorhinein schon passwort gesichert und kann von den Usern nicht verwendet werden.


bei Runas.exe lässt sich das Passwort für den adminaccount nicht direkt mitgeben.
man ruft das Programm wie folgt per cmd auf:
RUNAS.exe /profile /user:USERNAME@DOMAIN UNCPFAD

im Anschluss wird man nach dem Passwort gefragt welches ich eben nicht immer per hand eintippen möchte. Eben weil das Programm bereits kennwortgesichert ist.


Nun wollte ich mit Sendkeys das Passwort an die shell übergeben. Hier kommt es leider zu dem Problem.
Da es immer ein bisschen unterschiedlich lang dauert bis das CMD fenster geöffnet und das Passwort verlangt wird, funktioniert die Methode mit Sendkeys nicht zuverlässig da das Passwort oftmals nicht zur gänze übergeben wird.

kennt jemand eine schönere Lösung für dieses Problem?
bzw. wie man das Problem mit sendkeys umgehen könnte?

thread.sleep funktioniert leider auch nicht, da das fenster den Focus verliert.

lg Phil
 

zer0

Erfahrenes Mitglied
Du müsstest dir den OutputStream holen und dann in den InputStream schreiben. So funktioniert es jedenfalls bei Java.
 

Meronax

Mitglied
Danke für deine Antwort!
ich bin ein bisschen weiter gekommen und kann mir das Phänomen nicht erklären.

ich habe jetzt nur probiert Zeichen an die cmd box zu übergeben. wenn ich strings oder einzelne zeichen übergebe passiert nichts. Wenn ich allerdings ein {ENTER} übergebe regiert die box ganz normal als ob ich auf enter gedrückt hätte.

kann sich jemand erklären warum die normalen Zeichen nicht übergeben werden könnten?
 

Meronax

Mitglied
Leider nein. Habe bereits probiert "ipconfig" zu übergeben und nach ein paar sekunden mit enter zu bestätigen. Im Falle dass die Zeichen nur nicht sichtbar währen, müsste im anschluss die Anzeige von IPconfig erscheinen. Aber das passiert leider nicht.
 

Shakie

Erfahrenes Mitglied
Man kann ganz auf SendKeys verzichten. Wie zer0 bereits gesagt hat muss man sich den InputStream holen. Folgende Lösung funktioniert fast
C#:
System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo("runas.exe", "/profile /user:benutzer notepad.exe");
startinfo.RedirectStandardInput = true;
startinfo.UseShellExecute = false;
System.Diagnostics.Process process = System.Diagnostics.Process.Start(startinfo);
process.StandardInput.WriteLine("passwort");
Allerdings gibt es da noch ein Problem mit dem Encoding. Der String "passwort" ist UTF8, ich weiß nicht was für ein Encoding erwartet wird. Bei mir kam daher immer die Meldung, dass das Passwort falsch sei.
Aber ich bin mir sicher irgendwer anderes hier kann das Problem lösen :)
Das "UseShellExecute" habe ich übrigens nur deshalb auf False gestellt, weil in der MSDN steht, dass man das so tun soll, wenn man "RedirectStandardInput" auf True setzt.
EDIT: Du kannst auch gleich einen Benutzernamen, eine Domain und ein Passwort der ProcessStartInfo-Klasse übergeben. Das sollte das Leben viel leicher machen (abgesehen von der undankbaren Handhabung der SecureString-Klasse - hier habe ich als Passwort "123" verwendet - allerdings solltest du das Passwort auch nicht als String in der Exe speichern):
C#:
// Passwort erstellen
System.Security.SecureString password = new System.Security.SecureString();
password.AppendChar('1');
password.AppendChar('2');
password.AppendChar('3');
password.MakeReadOnly();
// Prozess starten
System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo("notepad.exe", "arguments");
startinfo.Password = password;
startinfo.UserName = "Benutzername";
startinfo.UseShellExecute = false;
System.Diagnostics.Process.Start(startinfo);
password.Dispose();
 
Zuletzt bearbeitet:

Meronax

Mitglied
Guten Morgen shakie,

vielen dank für deine Ausführliche Antwort. Ich werde dass heute probieren sobald ich dazu komme.
 

Meronax

Mitglied
Hallo,

jetzt hat es doch etwas länger gedauert.
der Tipp mit Processstartinfo funktioniert super. man muss lediglich noch startinfo.verb = "runas" hinzufügen damit die angegebenen Benutzerdaten verwendet werden.

vielen dank für eure Hilfe!
 

Meronax

Mitglied
entschuldigt bitte den Doppelpost :)

wie schon gesagt, funktioniert das starten als admin einwandfrei.
Wenn ich aber eine Datei die auf einem Netzlaufwerk liegt angebe, erhalte ich die fehlermeldung dass der angegebene pfad nicht gefunden werden konnte. Auch wenn ich den UNC-Pfad zu der Datei angebe erhalte ich diese fehlermeldung.

ich habe daraufhin versucht explizit das workingdirectory anzugeben und dazu nur noch die Datei die ich ausführen möchte. Das funktioniert leider auch nicht.

Es befinden sich auch keine leerzeichen im Pfad.

hat irgendjemand eine Idee?

danke für eure Hilfe