Prüfen ob Programm als admin gestartet wurde

  • VB.NET

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

    Prüfen ob Programm als admin gestartet wurde

    Hey allerseits :)

    Ich möchte beim Start meines Programms prüfen, ob es mit Administratorrechten gestartet wurde. Hintergrund ist der, dass mein Programm Textdateien liest und schreibt und auch die Metadaten von mp3 liest und schreiben kann. Wenn ich das nämlich nicht tue, stürzt mein Programm spätestens bei den genannten Aktionen ab, wenn ich vergesse, es als Admin zu starten. Dass es unter Windows10 eine Möglichkeit gibt, ein Programm immer mit Admin Rechten zu starten, weiss ich, ich will die Installation aber so einfach wie möglich halten.

    Ist das überhaupt möglich oder gibt es da einen anderen Workaround?

    Hab zwar Beiträge dazu gefunden aber die sind ziemlich alt und beziehen sich auf Vista oder 7...
    @kafffee So was:

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports System.Security.Principal
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim bb As Boolean = IsAdmin()
    6. MessageBox.Show(bb.ToString)
    7. End Sub
    8. Public Function IsAdmin() As Boolean
    9. Return CType(Thread.CurrentPrincipal, WindowsPrincipal).IsInRole(WindowsBuiltInRole.Administrator)
    10. End Function
    11. End Class
    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!
    @kafffee Verwende doch mal die Hilfe und experimentiere ein wenig.
    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!
    Wir haben bei uns eine Anwendung mit einem "manifest". Und in der \app.manifest steht unter anderem:

    XML-Quellcode

    1. <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
    2. <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    3. </requestedPrivileges>
    Das ist (c#) in den Projekteinstellungen eingerichtet, Reiter "Application" (kann in vb natürlich woanners rumfahren).
    Diese Anwendung kann man nur mit AdminRechten starten.

    (Hihi, kleine Gemeinheit: Unser Praktikant hat diese Vorgehensweise ergoogelt)
    Gegenfrage: Inwieweit

    kafffee schrieb:

    stürzt mein Programm spätestens bei den genannten Aktionen ab
    Wenn es Exceptions gibt, kann man die ja gezielt abfangen und reagieren. Testweise kann man das ja auch schon zu Programmstart mit einer DummyDatei machen und den User informieren.
    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.

    kafffee schrieb:

    stürzt mein Programm spätestens bei den genannten Aktionen ab
    Falls es da eine Exception gibt, kannst Du sie ja mal posten.
    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!
    @kafffee Da hab ich unter W10 sehr interessante Effekte erlebt, wenn eine Datei von einem Programm mit Admin-Rechten geschrieben wurde, konnte vom Normalo-Explorer aus nicht drauf zugegriffen werden. Kann sein, dass der Pfad geschützt war.
    Du kannst die Datei fragen, ob Du die Rechte hast, auf sie zuzugreifen.
    Muss ich mal nachsehen.
    ====
    Kläre (uns) mal auf, was das für eine Datei ist und in welchem Verzeichnis sie steht.
    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!
    Also die erste, bei der das auftritt, ist glaube ich die "<Programmpfad>\database\Dateinamen.txt". Sowohl der Ordner "database" als auch die Textdatei werden vom Programm selbst erstellt.
    Muss ich aber nochmal checken.
    Programmpfad in diesem Fall ist C:\Programme\MeinProgramm

    Edit: Das Programm lief auch "normal" , wenn ich es über das vom Veröffentlichungsassistenten erstellte Setup installiert hab. Der hat das Programm in einem Ordner bestehend aus Zeichensalat kopiert. Nur hab ich wohl diesmal irgendwelche Abhängigkeiten drin, dass zwar erfolgreich installiert wurde aber wenn ich dss Programm dann gestartet habe ist schlichtweg nichts passiert. Entweder das oder ich hab nicht lang genug gewartet, hab ne ziemlich alte Kiste ohne SSD...
    @RodFromGermany
    Wenn ich abfrage, ob ich auf die Datei zugreifen kann, das wäre in diesem Fall wohl nicht so schlau. Das sind bei mir ca. 10 Textdateien und mehrere tausend MP3s. Ausser ich mach das mit ner Dummydatei wie VaporiZed vorgeschlagen hat.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    C:\Programme\MeinProgramm
    kopiert und nicht installiert.
    Lass dieses Verzeichnis den Profi-Programmen und mach Dir ein eigenes Verzeichnis in der Root.
    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!

    kafffee schrieb:

    Man kann keine Datei überprüfen, die noch gar nicht erstellt wurde...
    Doch.
    Du kannst prüfen, ob Du im betreffen Verzeichnis Schreibrechte hast.
    stackoverflow.com/questions/18…ectory-has-access-to-list
    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!
    @kafffee Was willst Du denn tun, wenn Du festgestellt hast, dass das Resultat True oder False war?
    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!
    @kafffee Du kannst die MsgBox mit YesNo machen und dann sofort das Programm als Admin starten.
    Ich such mal fix den 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!
    @kafffee Dies hier:
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Run a program with elevated rights
    3. /// </summary>
    4. /// <returns>True if no error has occurred</returns>
    5. private static bool RunElevated()
    6. {
    7. // Get the full qualified path to the own executable
    8. string path = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase;
    9. ProcessStartInfo processInfo = new ProcessStartInfo();
    10. processInfo.Verb = "runas";
    11. processInfo.FileName = path;
    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 wirdt Du doch selbst nach VB übersetzen können, nimm ein Tool dazu.
    Die Imports bekommst Du über die MSDN, irgend was mit Principal.
    Der Klopper mit Reflection zur Bestimmung des Pfades der Exe ist so ausgelegt, dass innerhalb einer DLL funktioniert.
    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!