Laden...

Mit C# eine eml.Datei als anderer User öffnen

Erstellt von Joe78 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.016 Views
J
Joe78 Themenstarter:in
6 Beiträge seit 2015
vor 4 Jahren
Mit C# eine eml.Datei als anderer User öffnen

Hallo,

eine eml-Datei (_file = "\server-mail1\MailBackup\20200407153118_7402001502.eml")
liegt in einem Verzeichnis, auf das nur wenige zugreifen können.

Ich habe folgenden Code der klappt (öffnet eine eml-Datei mit dem Mailprogramm), wenn der Code vom meinem Account aufgerufen wird:

 try
                {
                    var first = new Process();
                    var pinfo = new ProcessStartInfo
                    {
                        FileName = _file,
                        Arguments = "/quiet",
                        CreateNoWindow = true
                    };
                    first.StartInfo = pinfo;
                    first.Start();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

Damit er aber auch von anderen Usern ausgeführt werden kann, wollte ich den Code ändern:

                try
                {
                    var first = new Process();
                    var pinfo = new ProcessStartInfo
                    {
                        FileName = _file,
                        Arguments = "/quiet",
                        CreateNoWindow = true
                    };
                    pinfo.UserName = "user";
                    pinfo.Domain = "XY";
                    pinfo.WorkingDirectory= Path.GetDirectoryName(_file);
                    var s = new System.Security.SecureString();
                    s.AppendChar('1');
                    s.AppendChar('2');
                    s.AppendChar('3');
                    s.AppendChar('4');
                    s.AppendChar('5');
                    s.AppendChar('6');
                    pinfo.Password = s;
                    pinfo.Verb = "runas";
                    pinfo.UseShellExecute = false;
                    first.StartInfo = pinfo;
                    first.Start();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

Wie ich gelesen hatte, sollte es damit eigentlich passen.
Nun bekomme ich aber die Meldung: > Fehlermeldung:

Die angegebene ausführbare Datei ist keine gültige Anwendung für diese Betriebsplattform.

Hat jmd vielleicht bitte eine Idee was ich hier falsch mache?

Grüße
Joe

2.079 Beiträge seit 2012
vor 4 Jahren

Hast Du bedacht, dass eine Standard-Anwendung für eine Datei-Endung unter einem anderen Konto nicht zwangsläufig verfügbar ist?
Genauso kannst Du auch ganze Programme nur für den aktuellen User zugreifen und wenn die Anwendung unter dem anderen Konto z.B. eine Datei auf dem Desktop liegt, wirst Du die auf deinem Desktop nicht finden, sondern auf dem vom anderen Konto. Oder unterschiedliche Rechte

Aber ganz allgemein:
Lass das, das ist grober Unfug, den Du da versuchst.

Besser wäre, wenn Ihr einen extra Konto für solche Anwendungen anlegt, ohne Mensch dahinter.
Deine Anwendung kann dann z.B. als Dienst auf einem Server unter diesem Konto laufen und andere User starten eine Anwendung, die dann diesen Dienst nutzt.
Dieses Konto kannst Du dann genau so einrichten, wie Du es brauchst, inklusive Standard-Einstellungen und Co. Ich persönlich würde aber lieber direkt die exe starten und die Datei als Parameter mit geben, dann bin ich an eine Konto-Einstellung weniger gebunden, die man später vergessen könnte.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

5.658 Beiträge seit 2006
vor 4 Jahren

Lass das, das ist grober Unfug, den Du da versuchst.

Schon allein durch das Speichern von Anmelde-Informationen im Quelltext sollten alle Alarmzeichen angehen, unabhängig davon, ob die sonstige Vorgehensweise sinnvoll ist.

Siehe dazu auch die Doku von SecureString.

Im Code-Beispiel dort wird das Passwort durch den Benutzer eingegeben, und ist daher nirgendwo gespeichert. Ansonsten steht da noch in einem fetten Rahmen:

Important

We don't recommend that you use the SecureString class for new development.

Im dort verlinkten Artikel dann nochmal:

Don't use SecureString for new code. When porting code to .NET Core, consider that the contents of the array are not encrypted in memory.

The general approach of dealing with credentials is to avoid them and instead rely on other means to authenticate, such as certificates or Windows authentication.

Weeks of programming can save you hours of planning