cmd als Administrator im Hintergrund starten, funktioniert nicht!

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von mnemonik.

    cmd als Administrator im Hintergrund starten, funktioniert nicht!

    Ich möchte gerne die Befehle im cmd eingeben und im Programm als Rückmeldung zurückbekommen. Soweit klappt alles ganz gut, doch die Administratorbefehle funktionieren nicht. Ich verstehe es nicht woran es liegen kann, meine Meinung nach ist alles richtig geschrieben. Kann mir jemand helfen?

    Habe keine hilfreiche Beiträge auf der Webseite gefunden.

    VB.NET-Quellcode

    1. Using p As New Process()
    2. With p.StartInfo
    3. .CreateNoWindow = True
    4. .Verb = "runas"
    5. .FileName = "cmd"
    6. .RedirectStandardInput = True
    7. .RedirectStandardOutput = True
    8. .RedirectStandardError = True
    9. .UseShellExecute = False
    10. End With
    11. p.Start()
    12. p.StandardInput.WriteLine(" Mein Befehl in cmd-Line ")
    13. p.StandardInput.WriteLine("exit")
    14. RichTextBox1.Text = p.StandardOutput.ReadToEnd()
    15. End Using

    @mnemonik Nimm mal das Using raus und pack die Deklaration aus der Prozedur in die Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Versuch es so mal:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private WithEvents proc As Process
    4. Sub StartProcess()
    5. proc = New Process
    6. proc.StartInfo.FileName = "cmd.exe"
    7. proc.StartInfo.WorkingDirectory = ""
    8. proc.StartInfo.CreateNoWindow = True
    9. proc.StartInfo.UseShellExecute = False
    10. proc.StartInfo.RedirectStandardOutput = True
    11. proc.StartInfo.RedirectStandardInput = True
    12. AddHandler proc.OutputDataReceived, AddressOf WriteProcessOutput
    13. proc.Start()
    14. proc.BeginOutputReadLine()
    15. End Sub
    16. Private Sub WriteProcessOutput(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
    17. If e.Data IsNot Nothing Then
    18. Me.Invoke(Sub() Me.RichTextBox1.AppendText(e.Data & vbNewLine))
    19. End If
    20. End Sub
    21. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    22. StartProcess()
    23. End Sub
    24. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    25. proc.StandardInput.WriteLine(InputBox("", "", "ping localhost"))
    26. End Sub
    27. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    28. Me.RichTextBox1.Clear()
    29. End Sub
    30. End Class
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss das startet die CMD nicht als Admin. Ausserdem bringt es sehr wenig wenn man nur fertigen Code postet.
    Zumal du noch nichtmal schreibst was falsch ist (deins startet wie gesagt nicht als admin).
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    mnemonik schrieb:

    Können Sie mir dabei helfen?
    Wir reden uns hier alle mit Du an. :thumbsup:

    VB.NET-Quellcode

    1. Private p As Process()
    2. Private Sub DoIt()
    3. p = New Process()
    4. With p.StartInfo
    5. .CreateNoWindow = True
    6. .Verb = "runas"
    7. .FileName = "cmd"
    8. .RedirectStandardInput = True
    9. .RedirectStandardOutput = True
    10. .RedirectStandardError = True
    11. .UseShellExecute = False
    12. End With
    13. p.Start()
    14. p.WaitForInputIdle() ' und den hier
    15. p.StandardInput.WriteLine(" Mein Befehl in cmd-Line ")
    16. p.StandardInput.WriteLine("exit")
    17. RichTextBox1.Text = p.StandardOutput.ReadToEnd()
    18. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja, innherhalb Deiner Formklasse sollte das Ganze schon sein. Also z.B.:

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'hier Code von RodFromGermany
    3. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dim p = New Process
    Das Dim fehlt.
    Aber Moment: Die bei Dir angezeigte Zeile#8 ist falsch. Die Klammern am Ende müssen weg.
    Das fällt bei RfG wohl unter c&p-Bremse …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Also, ich habe jetzt alles verbessert! Doch wenn ich das Programm starte, erscheint ein Fehler wegen diese Zeile "p.WaitForInputIdle()" hier. Ohne sie funktionieren die Adminbefehle nicht, nur ganz normale.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private p As Process
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim p = New Process()
    5. With p.StartInfo
    6. .CreateNoWindow = True
    7. .Verb = "runas"
    8. .FileName = "cmd"
    9. .RedirectStandardInput = True
    10. .RedirectStandardOutput = True
    11. .RedirectStandardError = True
    12. .UseShellExecute = False
    13. End With
    14. p.Start()
    15. p.StandardInput.WriteLine(" mein Befehl ")
    16. p.StandardInput.WriteLine("exit")
    17. RichTextBox1.Text = p.StandardOutput.ReadToEnd()
    18. End Sub
    19. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Das Dim fehlt.
    Nö.
    @mnemonik Sorry, Schreibfehler, war nicht als C&P-Bremse gedacht.

    VB.NET-Quellcode

    1. Private p As Process()
    machst Du

    VB.NET-Quellcode

    1. Private p As Process

    Und:
    @mnemonik Zitiere nicht ständig die Posts über Dir.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mnemonik Dann poste doch mal den kompletten relevanten Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mnemonik Was an dem Programm funktioniert nicht?
    Starte das Programm als Administrator:
    Zum Ausfhren von DISM sind erhöhte Rechte erforderlich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    mnemonik schrieb:

    Darin bestand eigentlich das Ziel!
    Warum stand davon nix in Deinem Eröffnungspost :?:
    Admin-Rechte nachladen geht nicht.
    Du kannst aber Dein eigenes Programm mit Admin-Rechten neu starten, selbes Verfahren, Process mit .Verb = "runas" und Pfad auf Deine Exe.
    Dazu solltest Du aber vorher testen, ob Dein Programm bereits mit Admin-Rechten läuft => WindowsPrincipal.
    Wenn Ja, nix tun, wenn nein, neu starten.
    Besser wäre es, das Programm gleich mit Admin-Rechten zu starten, dazu findest Du hier im Forum beliebig viele Beiträge.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Danke dir, werde mir alles anschauen!

    Kurze Frage noch:
    Wenn ich den Kompletten Befehl aus dem Textbox auslese dann funktioniert alles.

    VB.NET-Quellcode

    1. dism / online / export-driver /destination: "C:\drivers"


    Doch als ich versucht habe mein Befehl im Code zu integrieren und dem Pfad separat aus dem Textbox auszulesen, erscheint der Fehler über Problem mit Anführungszeichen. Was könnte damit falsch sein? Danke)

    VB.NET-Quellcode

    1. Dim SlashErsetzen AS String = Replace(Textbox1.Text, "/","\")
    2. p.StandardInput.WriteLine("dism / online / export-driver /destination: " & """" & SlashErsetzen & """")

    mnemonik schrieb:

    erscheint der Fehler über Problem mit Anführungszeichen.
    Poste mal den komplettenm Fehlertext.
    Und: Sieh Dir an, was Du da an den StandardInput sendest. Da erkennst Du wohl lelbst, was falsch ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!