cmd Verknüpfung als Administrator starten

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von DragonRE.

    cmd Verknüpfung als Administrator starten

    Hey Leute,

    ich verzweifel gerade an einem vermutlich kleinen Problem.

    Ich möchte ein abgewandeltes cmd-Fenster (Aufruf über eine Verknüpfung) ALS ADMINITRATOR ausführen.

    Bis auf das Thema das der Aufruf als Administrator passieren muss klappt auch alles.

    Anbei mal meine VB.net Zeile von Aufruf:

    Quellcode

    1. Process.Start(str_Script_Path & "" & "NX85_prompt.lnk", "/K " & str_Script_Drive & ": && cd " & str_Script_Path & "" & dbl_Counter & "&&" & str_EXPORT_LINE)


    Lasst Euch nicht verwirren, ich starte einen neuen Prozess, der die Verknüpfung aufruft .... (Ist letztenendes eine cmd.exe die ein paar Parameter mit auf die reise bekommt.)
    Danach setzte ich darin mehrere Befehle ab (z.B. "D:" "cd ..." und ein Befehl zum ausführen einer *.exe Datei).

    Wie bekomme ich das Gebilde als Administrator gestartet?

    Google war diesmal nicht mein Freund^^
    Zumindest bekomme ich die Lösungsansätze nicht meinen Wünschen gerecht angepasst...

    Ein gefundener Lösungsansatz: (.Verb ="runas")

    Quellcode

    1. Dim procStartInfo AsNew ProcessStartInfo
    2. Dim procExecuting AsNew Process
    3. With procStartInfo
    4. .UseShellExecute =True.FileName ="Notepad.exe".WindowStyle = ProcessWindowStyle.Normal
    5. .Verb ="runas"'add this to prompt for elevationEndWith
    6. procExecuting = Process.Start(procStartInfo)


    Würde mir bitte jemand auf die Sprünge helfen und meinen "Process.Start ...." abändern?
    Auch eine alternative Lösung wäre mir recht^^
    Bei Rückfragen .... Einfach raus damit.

    Dankeschön!

    DragonRE

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

    Verpasse deinem Programm Adminrechte, wenn dann ein Process von deinem Programm gestartet wird, werden die Adminrechte weitergereicht. Hatte mir kürlich eine Steuerung für TrueCrypt gemacht, die ich zwar mit der veralteten Shell Methode nutzte, aber mit der Process-Klasse müsste es auch funktionieren.
    hab keine Ahnung warum?

    vieleicht klappt es mit der Process-Klasse dann doch nicht ?(

    vieleicht auf die alte Shell Methode ausweichen?

    So hab ich TrueCrypt mit Command-Line-Befehlen versorgt, so das nicht bei jedem mouten/dimounten von Volumes die UAC Prompt wegen TrueCrypt(braucht Adminrechte) bekomme.

    VB.NET-Quellcode

    1. Shell("TrueCrypt /q /v /e /l" & dLetter(lIndex) & " " & Container(sIndex) & " /p" & Password)


    Edit: Damit ich auch beim debuggen Adminrechte hatte, musste ich VS auch mit Adminrechten starten.

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

    Hallo Derfuhr,

    mit welcher Methode ich das an den Start bringe ist mir ehrlich gesagt egal^^
    Leider kenne ich "Shell" mal garnicht und kann anhand Deiner Beispielzeile leider meinen Code auch nicht anpassen.

    Kannst Du meine Process.Start Zeile entsprechend anpassen?
    Zur Info: Ich starte meine Verknüpfung und setzte mehrere Befehle ab.

    Verknüpfung:
    str_Script_Path & "" & "NX85_prompt.lnk

    Option der CMD:
    "/K " (Hält das Fenster offen)

    Befehle die in der cmd abgesetzt werden müssen:
    1) (str_Script_Drive) = D:
    2) (cd " & str_Script_Path) = cd d:\TEMP\TEST
    3) (str_EXPORT_LINE) = Aufruf einer *.exe mit Parametern ...

    @faxe1008: Hast Du eine Lösung anzubieten oder Trollst Du nur rum?
    Mir sind Leute lieber, die Lösungsansätze bieten und das sogar in Ihrer Freizeit.

    Gruß,
    DragonRE

    Edit: Ergänzt: (Hält das Fenster offen) bei /K

    DragonRE schrieb:

    Befehle die in der cmd abgesetzt werden müssen:
    1) (str_Script_Drive) = D:
    2) (cd " & str_Script_Path) = cd d:\TEMP\TEST
    3) (str_EXPORT_LINE) = Aufruf einer *.exe mit Parametern ...


    Es wäre villeicht hilfreich wenn du die gesammten Zusammenhänge posten würdest also was die einzelnen Strings beinhalten, denn ohne meine Glaskugel weiß ich leider nicht was in cd drinne steht.

    Außerdem schau mal in die Boardregeln. Rot ist der Moderation vorbehalten.
    Weiterhin solltest du die Codeformatierung mal richten, damit das Ganze auch mal lesbar wird.

    Zur StartInfo Property: msdn.microsoft.com/de-de/libra…rtinfo%28v=vs.110%29.aspx. Übergib einfach die Parameter wie im Beispiel gezeigt.

    8-) faxe1008 8-)
    Ob das ganze dann funktioniert kann ich nicht garantieren, aber ich gebe dir gerne ein Beispiel wie man CMD via Shell benutzt(CMD direkt). Dieses Beispiel würde die Festplatte/Patition D: umbenennen. Falls Pfade verwendet werden die Leerzeichen(Space) enthalten die dann in doppelte ""pfad"" Gänsefüsschen packen, damit wie auch in .bat Dateien die "" da sind.

    VB.NET-Quellcode

    1. Shell("cmd /c label d: soheisstdasteilabjetzt")

    also Shell("cmd /c" [befehlszeile])

    Edit: @DragonRe:: so kann man direkt Prozesse starten:

    VB.NET-Quellcode

    1. Shell("""C:\Program Files\7-Zip\7zFM.exe""")

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

    Hallo faxe1008,

    auch Dir Danke für Deine Antwort.
    Du hast recht: rot wurde verändert in blau! (Sorry@ Admins)

    Ich habe zum besseren Verständniss im letzten Post die Befehle die letztenendes durch Variablen zusammengesetzt werden als Beispiel reingeschrieben.
    Um alles komplett zu machen Poste ich hier aber am Ende mal meinen kompletten Code ... (Ist noch nicht komplett und definitiv kein Meisterwerk. Aber dafür hochmotiviert von einem beinahe Unwissenden erzeugt worden *gg*)

    Alles was ich erreichen möchte ist folgendes:
    - Verknüpfung zu einer cmd.exe als Admin starten
    - darin 3 Befehle nacheinander absetzen


    Beispiel:
    - Starte die Verknüpfung zur cmd.exe ALS ADMIN
    - Wechsle Laufwerk z.B. nach "D:"
    - Wechsle Ordner z.B. d:\TEMP\TEST
    - Starte jetzt einen Aufruf ... Dieser sieht folgendermaßen aus "plmxml_export -u=infodba -p=PW -g=dba -transfermode=unconfiguredDataFileExport -xml_file=counter -item=1234567 -rev=A -log=PATH\counter_export.log"

    Ich scheitere lediglich daran, dass die Verknüpfung zur cmd jedesmal fragt ob sie als Admin ausgeführt werden soll- JA SOLL SIE^^
    Ich möchte damit etwas automatisieren, wobei der Aufruf ca. alle 5 Sekunden kommt.
    Da ist das Bestätigen mit "OK" unrealistisch.


    @ Derfuhr:
    Danke Dir für Deine Ansätze. Ich werde mich mal ein wenig mit google beschäftigen und sehen, ob ich bei Shell Optionen und mehrere BEfehle mit auf den Weg geben kann.

    Ich realisiere: Das mit den Adminrechten scheint mein Stolperstein zu werden^^
    Als motivierter aber unwissender kleiner Scripter stoße ich an meine Grenzen ;(


    Edit:
    Für die Übersichtlichkeit: Nicht funktionierender Code am Ende dieses Beitrages entfernt,
    da die Lösung mit funktionierendem Code im nachfolgenden Beitrag steht!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DragonRE“ ()

    Hallo zusammen,

    ich habe mein Thema gelöst bekommen!

    Aufgabenstellung:
    Eine cmd.exe mit zusätzlichen Argumenten als Administrator aus vb.net starten.

    Ursprüngliche Codezeile die den gewünschten Befehl ohne Adminrechte ausführt:

    Quellcode

    1. Process.Start(str_Script_Path & "" & "NX85_prompt.lnk", "/K " & str_Script_Drive & ": && cd " & str_Script_Path & "" & dbl_Counter & "&&" & str_EXPORT_LINE)


    Die getestete und funktionierende Lösung (Die Codezeilen, die die obige ersetzen):

    Quellcode

    1. Dim process As System.Diagnostics.Process = Nothing
    2. Dim processStartInfo As System.Diagnostics.ProcessStartInfo
    3. processStartInfo = New System.Diagnostics.ProcessStartInfo
    4. processStartInfo.FileName = str_Script_Path & "" & "NX85_prompt.lnk"
    5. processStartInfo.Verb = "runas"
    6. processStartInfo.Arguments = "/K " & str_Script_Drive & ": && cd " & str_Script_Path & "" & dbl_Counter & "&&" & str_EXPORT_LINE
    7. processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
    8. processStartInfo.UseShellExecute = True
    9. Try
    10. process = System.Diagnostics.Process.Start(processStartInfo)
    11. Catch ex As Exception
    12. MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    13. Finally
    14. If Not (process Is Nothing) Then
    15. process.Dispose()
    16. End If
    17. End Try



    Mein fetter Dank geht an alle, die sich eingebracht, mitdiskutiert und Ideen geliefert haben.

    Gruß,
    DragonRE