vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 10.01.23 21:21

Hallo Ihr Profis,

ich habe das Script von hier:

https://www.vbarchiv.net/tipps/tipp_1601-beliebige-verknuepfungen-erstellen-net.html

verwendet, um in meinem Proggi die Startup-Verknüpfung zu machen:

        My.Settings.MitWindowsStarten = chb_MitWindowsStarten.Checked
        My.Settings.StartenAlleBenutzer = rab_startenAlleBenutzer.Checked
        If My.Settings.StartenAlleBenutzer = True Then
            startMenuOrdner = System.Environment.GetFolderPath( _
              Environment.SpecialFolder.CommonStartup)
        Else
            startMenuOrdner = System.Environment.GetFolderPath( _
              Environment.SpecialFolder.Startup)
        End If
        linkpfad = startMenuOrdner & "\" & Application.ProductName & ".lnk"
        If My.Settings.MitWindowsStarten = True Then
            progPfad = Application.ExecutablePath
            ' Verknüpfung anlegen
            If IO.File.Exists(linkpfad) = False Then
                MsgBox(linkpfad & "....." & progPfad & "....." & _
                  Application.CompanyName & "....." & Application.StartupPath)
                MainForm.CreateShortcut(linkpfad, progPfad, "", _
                Application.CompanyName, Application.StartupPath)
            End If
        Else
            ' Verknüpfung löschen
            If IO.File.Exists(linkpfad) = True Then
                IO.File.Delete(linkpfad)
            End If
        End If
Das klappt auch wunderbar mit "My.Settings.StartenAlleBenutzer = false" (also nur aktueller Benutzer).

Nur, wenn ich versuche, eine Verknüpfung für "My.Settings.StartenAlleBenutzer = True" (alle Benutzer) zu erstellen, wirft mir die verlinkte Funktion "CreateShortcut" folgenden Fehler aus:

"Fehlercode: 5 - Fehlermessage: Der Zugriff auf den Pfad 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\Meine Exe.exe" wurde verweigert."

Und das, obwohl ich als Admin an der Kiste werkle.

Wie kann ich das Problem umgehen und auch für alle User die Startup-Verknüpfung erstellen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 10.01.23 21:43

P.S. Wenn ich die Exe erstelle und diese als Administrator starte, klappt es mit der Verknüpfung im Autostart von "Alle Benutzer" anlegen.
Die Exe liegt übrigens auf dem Fileserver, also nicht im lokalen Rechner.
Aber ich hätte schon gerne die Möglichkeit, die Verknüpfung für alle User anzulegen - ohne das Programm "Als Administrator starten".
Gibt es hierfür eine Lösung?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 11.01.23 20:49

Gibt es dazu eine Abfragemöglichkeit, ob die App unter dieser Einstellung gestartet wurde.
Wenn ja, dann den RadioButton "Alle Benutzer" auf enabled = true, andernfalls auf enabled = false zu setzen.

Gibt dazu es eine Lösung mit Restart der App mit der Einstellung "als Administrator ausführen"?

Dann könnte ich eine entsprechende Meldung einblenden und dem User anbieten, die App mit "Als Administrator ausführen" neu zu starten und damit den RadioButton enabled und damit checkbar zu machen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: HenryV
Datum: 12.01.23 16:20

Zum Überprüfen kannst du IsInRole(WindowsBuiltInRole) verwenden.
Public Function IsUserAdministrator() As Boolean
    Dim isAdmin As Boolean
    Try
        Dim user As WindowsIdentity = WindowsIdentity.GetCurrent()
        Dim principal As New WindowsPrincipal(user)
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator)
    Catch ex As UnauthorizedAccessException
        isAdmin = False
    Catch ex As Exception
        isAdmin = False
    End Try
    Return isAdmin
End Function
Ich würde eine neue App schreiben die nur die Verknüpfung erstellt und diese dann als Admin im Hintergrund ausführen lassen.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
  System.EventArgs) Handles Button1.Click
    Dim adminProcess As New System.Diagnostics.ProcessStartInfo With {
        .UseShellExecute = True,
        .WindowStyle = ProcessWindowStyle.Hidden,
        .WorkingDirectory = System.Environment.CurrentDirectory,
        .FileName = "AddToAllUsersAutostart.exe",
        .Verb = "runas"
    }
    Try
        System.Diagnostics.Process.Start(adminProcess)
    Catch exception As System.Exception
        MessageBox.Show(exception.Message, "MyApp", MessageBoxButtons.OK, _
          MessageBoxIcon.Exclamation)
    End Try
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 12.01.23 17:13

Hi Henry,

besten Dank für das Script.

Aber wenn ich das - ungetestet - richtig lese, prüft "IsUserAdministrator()" lediglich, ob der aktuelle User Admin oder Benutzer ist.
Oder sehe ich das falsch?

Mein Problem ist aber, dass ich - selbst als angemeldeter Administrator - mein Programm zusätzlich mit Rechtsklick auf dessen Exe und im Popup "Als Administrator ausführen" starten muss, wenn ich in meinem Programm die Verknüpfung zu meinem Programm für alle Benutzer anlegen lassen möchte.

Klappt das, wenn ich mit Deinem "button_click" eine neu erstellten EXE ausführen lasse, welche lediglich die Verknüpfung im Startup von "Alle Benutzer" anlegt?
Das wäre supi.

EDIT: Einen Adminprozess kann ich aber nur als angemeldeter Admin starten?

Muss ich gleich testen...

Beitrag wurde zuletzt am 12.01.23 um 17:14:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 12.01.23 23:36

Ups,
dazu müsste ich die "AddToAllUsersAutostart.exe" aber dynamisch erzeugen können, da mein Proggi ja in verschiedene Ordner installiert/gestartet werden kann und mir damit das Verknüpfungsziel, welches in die Verknüpfung eingetragen werden muss, unbekannt ist.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: HenryV
Datum: 13.01.23 14:39

Du kannst den Pfad auch als Argument übergeben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 13.01.23 15:12

Ach ja, stimmt - Danke Dir!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 14.01.23 18:56

Hi Henry,

wenn ich im Benutzerkonto als Adminkonto eingeloggt bin und Deinen Code aufrufe, bekomme ich false zurück geliefert, da im Einzelschritt der Variable "User" kein Wert zugewiesen wird.

Auch https://www.vbarchiv.net/tipps/tipp_1857-isadmin-hat-der-aktuelle-user-adminrechte.html gibt false zurück.
Ebenso wie die Funktionen von hier: https://www.vb-paradise.de/index.php/Thread/108560-Pr%C3%BCfen-ob-aktueller-Benutzer-Adminrechte-hat/

Nur, wenn ich das compilierte Proggi explizit im rechte Maus Popup "als Admin ausführen" starte, geben alle Funktionen true zurück.

Also müssten Deine und die Funktionen aus den Links eher "ProgramStartedAsAdmin" heissen.

Gibt es denn auch eine Funktion, welche einfach angibt, ob der aktuell angemeldete User als Admin oder als Benutzer angemeldet ist?
Eine Funktion zum auslesen des Servernamens und Benutzernamens habe ich schon mal gefunden.
Aber leider keine funktionierende userIsAdmin-Funktion.

Denn mein Ziel ist es letztendlich, das Anlegen der obigen Programmverknüpfung im Startup von "All Users" wirklich nur den Admins und nicht den schnöden Benutzern zu gestatten. Letztere sollen den RadioButton "Verknüpfung für alle Benutzer" nur Enabled = false sehen. Lediglich der RadioButton "Verknüpfung für aktuellen Benutzer" sollen die anklicken können.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verknüpfung erstellen im Startup für aktuellen User OK - Alle Benutzer scheitert 
Autor: Dideldum
Datum: 14.01.23 23:08

Habe eine funktionierende isAdmin() gefunden:
https://www.vb-paradise.de/index.php/Thread/108560-Pr%C3%BCfen-ob-aktueller-Benutzer-Adminrechte-hat/

Private Function AdminPermissions() As Boolean
      Using p As New Process()
         p.StartInfo = New ProcessStartInfo With {
            .FileName = "cmd",
            .RedirectStandardInput = True,
            .RedirectStandardOutput = True,
            .CreateNoWindow = True,
            .UseShellExecute = False}
         p.Start()
         p.StandardInput.WriteLine("net user " & Environment.UserName)
         p.StandardInput.WriteLine("exit")
         Do
            Dim line = p.StandardOutput.ReadLine
            If line Is Nothing Then Return False
            If line.ToLower.Contains("administrator") Then Return True
         Loop
      End Using
   End Function
Mit dieser Funktion "AdminPermissions" kann ich für Benutzer den Button "Shortcut für alle Benutzer anlegen" ausblenden. Diese können nur Verknüpfungen in deren eigenen Benutzerkonten-Startmenu-Ordnern anlegen (allerdings über die im EP verlinkte Funktion, da bei dieser keine Abfrage wie beim Ausführen der VerknüpfungErstellen.exe erscheint).

Ist ein Admin eingeloggt, ist den Button "Shortcut für alle Benutzer anlegen" enabled und er kann diesen anklicken. Dahinter habe ich Deine Lösung zum Anlegen von Startverknüpfungen ir All Users-Startmenu. Hier muss er die Sicherheitsfrage zum Ausführen der VerknüpfungErstellen.exe bestätigen und dann wird die Verknüpfung im All Users-Startup erstellt.

Jetzt klappt es genau so, wie gewünscht.

Vielen Dank nochmal für's Helfen und ein schönes Rest-Weekend
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel