Als Admin starten

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Als Admin starten

    Hallo,
    ich habe ein Programm geschrieben. Wenn man auf dieses Programm drauf klickt (also die exe Datei) soll es als Administrator ausgeführt werden. Ich habe es versucht mit:

    VB.NET-Quellcode

    1. Dim info As New ProcessStartInfo
    2. info.FileName = ("C:\Users\Andy\Desktop\Programm.exe")
    3. info.Verb = "runas"
    4. Process.Start(info)


    Aber das Problem ist, wenn man diese exe Datei (mein Programm) in einem anderen Ordner verschiebt, dann stimmt ja der Pfad der Datei nicht mehr...
    Wie kann man dieses Problem lösen? Die Lösung soll ein Quellcode sein, nicht mit der Manifestdatei.
    Kann es sein, dass Du 2 Programme hast: Ein Hauptprogramm, ein Startprogramm? Denn sonst blick ich es nicht: Wer soll sonst den Code ausführen? Oder soll sich das Programm selber starten?
    Was spricht gegen die Manifest-Datei, die sonst dafür hergenommen wird?
    Du könntest probieren, einfach den Pfad wegzulassen oder ihn quasirelativ mit Application.ExecutablePath anzugeben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich habe ein Programm, mit dem ich mit dem CodeDom Compiler eine exe Commpielen kann. Und die erstellte exe soll als Admin starten, deswegen brauche ich dazu den Code. Wenn ich Application.ExecutablePath angebe:

    VB.NET-Quellcode

    1. Dim info As New ProcessStartInfo
    2. info.FileName = Application.ExecutablePath
    3. info.Verb = "runas"
    4. Process.Start(info)


    dann werden laufend Fenster geöffenet von dem Programm. Wenn ich den Pfad weg lasse passiert nix.
    @Script1 Wenn Du die Quellen dieses Programms hast, mach es über das app.manifest:
    Hinzufügen => Neues Element => Anwendungsmanifestdatei

    XML-Quellcode

    1. <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    ==>

    XML-Quellcode

    1. <requestedExecutionLevel level="requireAdministrator" uiAccess="true" />
    Feddich.
    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!
    Will er ja nicht

    Script1 schrieb:

    Die Lösung soll ein Quellcode sein, nicht mit der Manifestdatei.
    Warum, ist immer noch unklar.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Script1 So was:

    C#-Quellcode

    1. /// <summary>
    2. /// Run a program with elevated rights
    3. /// </summary>
    4. /// <param name="fileName">Path to the executable to run</param>
    5. /// <returns>True if no error has occurred</returns>
    6. private static bool RunElevated(string fileName)
    7. {
    8. ProcessStartInfo processInfo = new ProcessStartInfo();
    9. processInfo.Verb = "runas";
    10. processInfo.FileName = fileName;
    11. processInfo.Arguments = Program.StartAdmin;
    12. try
    13. {
    14. Process.Start(processInfo);
    15. return true;
    16. }
    17. catch (System.ComponentModel.Win32Exception)
    18. {
    19. //Do nothing. Probably the user canceled the UAC window
    20. }
    21. return false;
    22. }
    Das Programm kann auch sich selbst als Admin starten:

    C#-Quellcode

    1. // Start itself with adminrights
    2. if (MainForm.RunElevated(path))
    3. {
    4. // Close old programwindow
    5. this.Close();
    6. return;
    7. }
    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!
    @Script1 Der Code ist so elementar einfach, das kannst Du allein. :D
    In meiner Signatur findest Du einen Code-Converter.
    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!
    Danke für die Hilfe.

    VB.NET-Quellcode

    1. Private Shared Function RunElevated(ByVal fileName As String) As Boolean
    2. Dim processInfo As ProcessStartInfo = New ProcessStartInfo()
    3. processInfo.Verb = "runas"
    4. processInfo.FileName = fileName
    5. processInfo.Arguments = Program.StartAdmin
    6. Try
    7. Process.Start(processInfo)
    8. Return True
    9. Catch __unusedWin32Exception1__ As System.ComponentModel.Win32Exception
    10. End Try
    11. Return False
    12. End Function

    Diesen Code habe ich unter Class Form gesetzt, nur bei processInfo.Arguments = Program.StartAdmin
    ist bei dem Wort Program ein roter Kringel.
    Wie kann ich das Problem lösen?
    @Script1 Die ganze Zeile kannst Du einfach weglassen, das ist meine spezielle Kommandozeile.
    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!

    Script1 schrieb:

    kommt eine Fehlermeldung.
    Zunächst postest Du mal die Fehlermeldung.
    Meinen Code rufst Du auf, wenn das Programm mit Admin-Rechten neu gestartet werden soll.
    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!
    Wieso möchtest du denn irgendwas kompilieren und das als Admin starten? Erklär mal was du vor hast. Wenn ich "Admin starten" und "kompilieren" höre und "das muss nur Code ohne manifest" dann läuten bei mir wieder Alarm Glocken.

    Evtl. machst du es dir ja schwieriger als es ist.

    Btw. ist dein Screenshot mit der Fehlermeldung steht ja der Fehler drin.. Kein Dateiname angegeben.
    Zeich doch mal deinen Code wie du das ganze aufrufst usw. nicht nur stückelzeug. Was übergibst du denn der Funktion als fileName?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @Script1 Welchen Inhalt hat die Variable fileName :?:
    Das kannst Du ja mit nem Haltepunkt schneller aufklären, als dass Du hier einen Post schreibst.
    Debuggen, Fehler finden und beseitigen
    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!

    Script1 schrieb:

    und es klappt nicht so
    Womit?
    Mit dem Code? Was passiert, was passiert nicht?
    Mit dem Debuggen? Das ist Elementar-Handwerk eines jeden Programmierers / Softwareentwicklers.
    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!
    Da passiert nix wenn ich den Code:

    VB.NET-Quellcode

    1. Private Shared Function RunElevated(ByVal fileName As String) As Boolean
    2. Dim processInfo As ProcessStartInfo = New ProcessStartInfo()
    3. processInfo.Verb = "runas"
    4. processInfo.FileName = fileName
    5. Try
    6. Process.Start(processInfo)
    7. Return True
    8. Catch __unusedWin32Exception1__ As System.ComponentModel.Win32Exception
    9. End Try
    10. Return False
    11. End Function


    unter Class Form setze. Da werde ich nicht gefragt, ob ich das Programm als Admin starten möchte. Muss ich die Private Shared Function unter Form1 noch mit einem Quellcode aufrufen?

    Script1 schrieb:

    Muss ich die Private Shared Function unter Form1 noch mit einem Quellcode aufrufen?
    Code, der abgeatbeitet werden soll, sollte natürlich aufgerufen werden.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. RunElevated("Notepad.exe")
    3. 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!