diff --git a/.gitignore b/.gitignore index 8c26d32..f49cca7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ data.json +Programm-Shortcut.7z diff --git a/run.py b/run.py index 2b0543a..7248e4f 100644 --- a/run.py +++ b/run.py @@ -456,7 +456,7 @@ class ProgramLauncher: info_frame.grid(row=4, column=0, columnspan=2, sticky="ew", pady=5) # Version - version_label = ttk.Label(info_frame, text="Version: 1.0", font=("Segoe UI", 9)) + version_label = ttk.Label(info_frame, text="Version: 1.1", font=("Segoe UI", 9)) version_label.pack(anchor="w") # Copyright & Autor Info @@ -705,17 +705,41 @@ class ProgramLauncher: return item_id = selected_items[0] + program_values = self.program_tree.item(item_id, "values") + program_name = program_values[0].strip() # Leerzeichen am Anfang entfernen program_path = self.program_tree.item(item_id, "tags")[0] + # Prüfen, ob das Programm Adminrechte benötigt + requires_admin = False + for program in self.programs: + if program["Name"].strip() == program_name.strip(): + requires_admin = program.get("Adminrechte", False) + break + try: - subprocess.Popen(program_path) + if sys.platform == "win32" and requires_admin: + try: + # Direkter Aufruf über ShellExecute API mit erhöhten Rechten + import ctypes + # Der Parameter "runas" fordert erhöhte Rechte an + result = ctypes.windll.shell32.ShellExecuteW(None, "runas", program_path, None, None, 1) + # Wenn der Rückgabewert <= 32 ist, gab es einen Fehler + if result <= 32: + # Fallback: Starte normal ohne erhöhte Rechte + subprocess.Popen(program_path) + except Exception: + # Wenn es fehlschlägt, starte normal + subprocess.Popen(program_path) + else: + # Normaler Start ohne Adminrechte + subprocess.Popen(program_path) except Exception as e: messagebox.showerror("Fehler", f"Fehler beim Starten des Programms: {str(e)}") def add_program(self): add_window = tk.Toplevel(self.root) add_window.title("Programm hinzufügen") - add_window.geometry("450x250") + add_window.geometry("450x280") # Etwas mehr Platz für die Checkbox add_window.resizable(False, False) add_window.grab_set() # Modal machen @@ -752,15 +776,21 @@ class ProgramLauncher: if self.categories: category_combobox.current(0) # Erste Kategorie auswählen, falls vorhanden + # Checkbox für Adminrechte + admin_var = tk.BooleanVar(value=False) + admin_check = ttk.Checkbutton(frame, text="Benötigt Administratorrechte", variable=admin_var) + admin_check.grid(row=3, column=0, columnspan=3, sticky="w", pady=5) + # Buttons button_frame = ttk.Frame(frame) - button_frame.grid(row=3, column=0, columnspan=3, pady=15) + button_frame.grid(row=4, column=0, columnspan=3, pady=15) save_button = ttk.Button(button_frame, text="Speichern", command=lambda: self.save_new_program( name_entry.get(), path_entry.get(), - category_combobox.get(), + category_combobox.get(), + admin_var.get(), add_window)) save_button.pack(side=tk.LEFT, padx=5) @@ -777,7 +807,7 @@ class ProgramLauncher: if filename: entry_widget.insert(0, filename) - def save_new_program(self, name, path, category, window): + def save_new_program(self, name, path, category, requires_admin, window): if not name or not path: messagebox.showwarning("Warnung", "Bitte füllen Sie alle Felder aus.") return @@ -800,6 +830,10 @@ class ProgramLauncher: for cat in sorted(self.categories): self.category_listbox.insert(tk.END, cat) + # Adminrechte-Flag hinzufügen + if requires_admin: + new_program["Adminrechte"] = True + self.programs.append(new_program) self.save_data() self.populate_program_list() @@ -871,7 +905,7 @@ class ProgramLauncher: # Bearbeitungsfenster edit_window = tk.Toplevel(self.root) edit_window.title("Programm bearbeiten") - edit_window.geometry("450x250") + edit_window.geometry("450x280") # Etwas mehr Platz für die Checkbox edit_window.resizable(False, False) edit_window.grab_set() # Modal machen @@ -911,17 +945,23 @@ class ProgramLauncher: category_combobox.set(program_category) elif self.categories: category_combobox.current(0) # Erste Kategorie auswählen, falls vorhanden + + # Checkbox für Adminrechte + admin_var = tk.BooleanVar(value=self.programs[program_index].get("Adminrechte", False)) + admin_check = ttk.Checkbutton(frame, text="Benötigt Administratorrechte", variable=admin_var) + admin_check.grid(row=3, column=0, columnspan=3, sticky="w", pady=5) # Buttons button_frame = ttk.Frame(frame) - button_frame.grid(row=3, column=0, columnspan=3, pady=15) + button_frame.grid(row=4, column=0, columnspan=3, pady=15) save_button = ttk.Button(button_frame, text="Speichern", command=lambda: self.update_program( program_index, name_entry.get(), path_entry.get(), - category_combobox.get(), + category_combobox.get(), + admin_var.get(), edit_window)) save_button.pack(side=tk.LEFT, padx=5) @@ -934,7 +974,7 @@ class ProgramLauncher: entry_widget.delete(0, tk.END) entry_widget.insert(0, filename) - def update_program(self, index, name, path, category, window): + def update_program(self, index, name, path, category, requires_admin, window): if not name or not path: messagebox.showwarning("Warnung", "Bitte füllen Sie alle Felder aus.") return @@ -957,6 +997,10 @@ class ProgramLauncher: for cat in sorted(self.categories): self.category_listbox.insert(tk.END, cat) + # Adminrechte-Flag hinzufügen + if requires_admin: + updated_program["Adminrechte"] = True + self.programs[index] = updated_program self.save_data() self.populate_program_list()