Output-Umleitung in anderem Benutzerkontext

zrimp

Grünschnabel
Hallo,

ich habe ein Problem (welche Überraschung ;) ):
Sobald man den Benutzerkontext ändert, in welchem eine Anwendung ausgeführt werden soll, lässt sich der Out- und Input nicht mehr umleiten sowie ein Fenster nicht mehr als „nicht anzeigen“ ausführen.

Ich erkläre es am Code (ist vielleicht verständlicher). Es werden alle benötigten Parameter werden in einem Objekt übergeben.
Code:
private void ProzessAusfuehren(object[] Anweisungen)
        {
            lock (this)
            {
                p = new Process(); // neuen Prozess erstellen
                p.StartInfo.FileName = Anweisungen[0].ToString(); // Anwendung
                p.StartInfo.Arguments = Anweisungen[1].ToString(); // Parameter
                if (Anweisungen.GetLength(0) > 2)
                {
                    p.StartInfo.UserName = (string)Anweisungen[2]; // Benutzernamen
                    p.StartInfo.Password = (System.Security.SecureString)Anweisungen[3]; // Passwort
                    p.StartInfo.Domain = "geändert ;)"; // Domäne
                    p.StartInfo.UseShellExecute = false;
                    if (Anweisungen.GetLength(0) == 5) // Arbeitsverzeichnis zuweisen
                        p.StartInfo.WorkingDirectory = Anweisungen[4].ToString(); 
                    else
                        p.StartInfo.WorkingDirectory = @"C:\";
                }                
                p.Start(); // Prozess starten                  
            }     
        }
So ausgeführt, funktioniert alles. Mit dem Nachteil, dass sich bspw. netsh in den Vordergrund drängt und ein Fenster offen hält während die Ports für meine Anwendung geöffnet werden.

Das Problem bei der Sache ist nun, dass sobald der Benutzerkontext übergeben wird (also nicht der normale PC-Benutzer in dessen Kontext die Anwendung gestartet wird und welche über keinerlei administratorischen Berechtigungen verfügt), ist es nicht mehr möglich folgende Befehle auszuführen:
Code:
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

Meine Hoffnung war nun, den OutPut umleiten zu können. Doch auch diese Funktion steht augenscheinlich nur dann zur Verfügung, wenn keine Benutzerdaten übergeben werden. In folgendem Code-Beispiel funktioniert es:
Code:
        private void ProzessAusfuehren(object[] Anweisungen)
        {
            lock (this)
            {
                p = new Process(); // neuen Prozess erstellen
                p.StartInfo.FileName = Anweisungen[0].ToString(); // Anwendung
                p.StartInfo.Arguments = Anweisungen[1].ToString(); // Parameter
                if (Anweisungen.GetLength(0) > 2)
                {
                    //p.StartInfo.UserName = (string)Anweisungen[2]; // Benutzernamen
                    //p.StartInfo.Password = (System.Security.SecureString)Anweisungen[3]; // Passwort
                    //p.StartInfo.Domain = "geändert ;)"; // Domäne
                    p.StartInfo.UseShellExecute = false; 
                    if (Anweisungen.GetLength(0) == 5) // Arbeitsverzeichnis zuweisen
                        p.StartInfo.WorkingDirectory = Anweisungen[4].ToString(); 
                    else
                        p.StartInfo.WorkingDirectory = @"C:\";

                    //------------------------------\\
                    p.StartInfo.ErrorDialog = false;
                    p.StartInfo.CreateNoWindow = true;
                    p.StartInfo.RedirectStandardOutput = true;
                    ///----------------------------\\\
                }                
                p.Start(); // Prozess starten  
                //------------------------------\\
                StreamReader SR = p.StandardOutput;
                string strOutput = SR.ReadToEnd();
                SR.Close();
                ///----------------------------\\\
            }     
        }
Man beachte bitte, dass hier der Benutzername, sein Passwort und die Domäne auskommentiert sind. Sobald man diese einkommentiert bekommt man folgende Fehlermeldung:
bc8k3opia0plahk7o.png





Und die sicherlich unlängst erwartete Frage lautet:
Wie kann ich den OutPut so umleiten, dass er auch dann umgeleitet wird, wenn ich den Prozess in einem anderen Benutzerkontext ausführe?

Verwendete Software:
Visual Studio 2005 Pro
.Net 2.0 (3.5 ist installiert)
Windows XP Pro

Verwendete Hardware:
HP dx6100 MT (Arbeitsspeichererweiterung auf 4 GiB)
 
Zuletzt bearbeitet:
Hmmm... weiß es keiner oder geht es schlicht und ergreifend nicht? Das ich nichts finden konnte, würde ja dafür sprechen, das es nicht möglich ist. *seuftz*

Naja, dann muss man die Firewall wohl über die Gruppenrichtlinie frei geben lassen. Sollte aber jemanden eine intelligente Antwort auf Lager haben, immer her damit. Man wird früher oder später sicherlich erneut in eine ähnliche Lage kommen und eine Lösung gebrauchen können.
 
Ich denke auch, dass es schlichtweg nicht möglich ist. Der Prozess gehört dem startenden User einfach nicht mehr und dann darf man da auch nicht mehr dram rum spielen. Klingt zumindestens logisch. Sinnvoll ist wieder eine andere Sache.

Also das Problem mit dem Fenster verstecken konnte ich nachvollziehen. Aber stdout abzugreifen funktionierte bei mir mit und mit ohne Zugangsdaten. Hier mein Testapp:

PHP:
using System;
using System.Diagnostics;
using System.IO;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Bitte Adminpass eingeben: ");
            System.Security.SecureString pass = new System.Security.SecureString();
            ConsoleKeyInfo nextKey = Console.ReadKey(true);
            while (nextKey.Key != ConsoleKey.Enter)
            {
                if (nextKey.Key == ConsoleKey.Backspace)
                {
                    if (pass.Length > 0)
                    {
                        pass.RemoveAt(pass.Length - 1);
                        Console.Write(nextKey.KeyChar);
                        Console.Write(" ");
                        Console.Write(nextKey.KeyChar);
                    }
                }
                else
                {
                    pass.AppendChar(nextKey.KeyChar);
                    Console.Write("*");
                }

                nextKey = Console.ReadKey(true);
            }

            Console.WriteLine();
            Console.WriteLine("Führe Ping aus....");
            Process p = new Process(); // neuen Prozess erstellen
            p.StartInfo.FileName = "ping"; // Anwendung
            p.StartInfo.Arguments = "10.176.201.187"; // Parameter
            p.StartInfo.UserName = "admin"; // Benutzernamen
            p.StartInfo.Password = pass; // Passwort
            p.StartInfo.Domain = "domain"; // Domäne
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.WorkingDirectory = "C:\\";
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

            //------------------------------\\
            p.StartInfo.ErrorDialog = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardOutput = true;
            ///----------------------------\\\
            p.Start(); // Prozess starten  
            //------------------------------\\
            Console.WriteLine("Prozess läuft, warte auf Prozessende...");
            StreamReader SR = p.StandardOutput;
            string strOutput = SR.ReadToEnd();
            Console.WriteLine("Prozess beendet, hier die Ausgabe:\n");
            Console.Write(strOutput);
            SR.Close();
            Console.WriteLine("\nEnter drücken zum Beenden");
            Console.ReadLine();
            ///----------------------------\\\

        }
    }
}

Allerdings habe ich Visual Studio 2008 Express verwendet. Als Framwork habe ich 3.5 und 2.0 ausprobiert und bei beiden die selben Ergebnisse gehabt: Username da = Kein Fensterverstecken.

Dann hab ich mal auf der CreateNoWindow Eigenschaft F1 gedrückt:

Hinweise
Wenn die UserName-Eigenschaft und die Password-Eigenschaft nicht NULL-Verweis (Nothing in Visual Basic) sind, wird der CreateNoWindow-Eigenschaftenwert ignoriert, und ein neues Fenster wird erstellt.

Bitteschön :D Ich denke, Thread erledigt :D Hätte ich gleich drauf kommen können in der MSDN nachzuschlagen :D
 
Zurück