| |
VB.NET - Ein- und UmsteigerVerknü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? | |
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? | |
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. | |
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 | |
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. | |
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. | |
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. | |
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! | |
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. | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Oktober 2024 Heinz PrelleFirewall-Status unter WinXP/Vista prüfenDas Beispiel prüft, ob die Firewall unter Windows XP/Vista eingeschaltet ist oder nicht. Zudem wird eine Abfrage durchgeführt ob es sich bei dem zugrundeliegenden Betriebssystem um Windows XP/Vista handelt oder nicht. sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|