mayho33
Goto Top

Psexec functioniert nicht unter C-Sharp mit Process.Start()

Hallo @ All!

Ich knabbere seit 2 Tagen an einem Problem mit Psexec und C# das schon fein funktioniert hat, komme aber nach einer winzigen Änderung (vermutlich ganz unbewusst) irgendwie auf keinen grünen Zweig mehr und bitte um eure Unterstützung!

Das Problem im Detail:

in einem Forms-Project (.Net 4.0) liste ich in einer ListView mit 4 Spalten (PackageName, Version, DurationTime, Status) alle Packages (Installscripts) die von den Usern selbst installiert werden dürfen. die Exe läuft im User-Kontext und erst beim Klick auf INSTALL werden aus einer Rijndael AES 256-Bit verschlüsselten (ja ich weiß! Ein Sicherheitsrisiko, aber alle die das knacken könnten haben eh Adminrechte) Datei die Credentials des lokalen Administrator ausgelesen und danach unter anderem folgender Code ausgeführt:

private int InstallPackage(ClassModel currentPackage)
{
    /*
          Weiterverarbeitung des Returncodes, Aktualisierung der View usw. in anderen Methoden und Funktionen
    */
    int toReturn = -999999;
    Process p = new Process();
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.Domain = "";  
    p.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);
    p.StartInfo.UserName  = MainConfigModel.Credentials.adminuser;
    p.StartInfo.Password  = MainConfigModel.Credentials.adminpassword; (als SecureString)
    p.StartInfo.FileName  = "cmd.exe";  
    p.StartInfo.Arguments = @"/c c:\OsTools\psexec.exe -s -accepteula cscript " + (char)34 + Path.Combine(currentPackage.FullPath, currentPackage.Script) + (char)34 + " " + currentPackage.Param;  
    try
    {
        p.Start();
        p.WaitForExit();
        toReturn = p.ExitCode;
    }
    catch (Exception e)
    {
        var wex = e as Win32Exception;
        if (wex == null)
            toReturn = 1;
        else
            toReturn = wex.NativeErrorCode;
    }
            return toReturn;
}

wird der Code so ausgeführt bekomme ich solche komischen Meldungen:
ba3d2f9c406ff4511aab340391f55774

Aber auch sowas wie:
Der PSEXEC-Service konnte nicht installiert werden (ist vermutlich ein Credential-Fehler)
Die Datei konnte nicht gefunden werden (nur welche?)
Zugriff verweigert (WAAAAAAAAAAAAAAS?????)

Lustigerweise (1) funktioniert der ArgumentString wenn ich ihn direct in der Console ausführe als lokaler Administrator.
Lustigerweise (2) funktionert der Aufruf unter C#, wenn ich psexec weg lasse (??). Das geht aber leider nicht, weil bestimmte Teile leider immer als System-Account laufen müssen.

Die Packages sind getestete SCCM-Packages und 100% lauffähig. Das als Fehler kann ich eindeutig ausschließen. Es muss wohl irgendwo in diesem Code ein Fehler vorliegen. Nur wo??

Danke für eure Unterstützung!

Grüße, Mayho

Content-Key: 280597

Url: https://administrator.de/contentid/280597

Printed on: April 25, 2024 at 16:04 o'clock

Member: emeriks
emeriks Aug 19, 2015 at 11:22:21 (UTC)
Goto Top
Hi,
ich vermute mal, Local System hat keinen Zugriff auf das Script.
Teste mal, indem Du einfach mit cmd /c type ..." das Script ausgeben lässt (statt Psexec).

Was auch helfen kann, vorher mit "Console.WriteLine" das
(char)34 + Path.Combine(currentPackage.FullPath, currentPackage.Script) + (char)34 + " " + currentPackage.Param
ausgeben lassen.

E.
Member: mayho33
mayho33 Aug 19, 2015 at 13:27:46 (UTC)
Goto Top
Hi emeriks!

System hat Zugriff auf das Script, denn wenn ich es mit der selben Commandline in der Console als System ausführe funktioniert es problemlos. Meine Vermutung ist, dass in den Startinfos das Problem liegt. Übrigens hat es ja schon funktioniert. ich habe irgendwo eine Kleinigkeit geändert und seitdem geht nichts mehr. Ich weiß nur nicht mehr wo ich die Änderung gemacht habe.

Das gleiche mur ohne PSexec aus c# heraus funktioniert ebenso. Console.writeline() schaut gut aus. den String nehmen und im cmd ausführen geht auch. daran loiegt es nicht.

Grüße, Mayho
Member: emeriks
emeriks Aug 19, 2015 updated at 13:39:04 (UTC)
Goto Top
Google sagt mir, dass "error deriving session key" offenbar ein von PSexec gelieferter Fehler ist.
Dass PSexec noch gestartet wird, das siehst Du ja in Deinem Screenshot. Also funktioniert Dein C# Code schon mal.
Ich würde jetzt speziell in Richtung PSEXEC suchen.
Member: colinardo
Solution colinardo Aug 19, 2015, updated at Aug 20, 2015 at 16:58:02 (UTC)
Goto Top
Hallo mayho,
das hatte ich in der Form auch schon mal. Das hat was mit dem Sessionkey und dem Userprofil zu tun, den PSEXEC nur abrufen kann wenn das Profil des Users geladen wurde, was Standardmäßig beim Process-Objekt nicht der Fall ist. Dazu musst du im Startinfo-Objekt noch die Eigenschaft LoadUserProfile auf true festlegen:
p.Startinfo.LoadUserProfile = true;
Dann sollte es normalerweise laufen.

Grüße Uwe
Member: mayho33
mayho33 Aug 20, 2015 updated at 17:00:11 (UTC)
Goto Top
Hi Uwe!

Wie immer "PERRRRFEKT" Das war es! Funktioniert!

Vielen, vielen Dank an dich und natürlich an alle anderen Beteiligten!

Grüße, Christian