Zugriff auf Bedienungshilfen (Reiter Sicherheit unter Mavericks)

MichaHo

MichaHo

Aktives Mitglied
Thread Starter
Dabei seit
09.11.2010
Beiträge
121
Reaktionspunkte
8
Hallo,

ich habe ein kleines App um meine Netzlaufwerke zu verbinden.

Bei Erfolgreichem Verbinden möchte ich mit

Code:
[FONT="Verdana"][size=2][color=#0016B0][b]display notification[/b][/color] "Alle Laufwerke verbunden!" [color=#0016B0]with title[/color] "Company mounting"[/size][/FONT]

einen Hinweis über die Mitteilungszentrale ausgeben.

Wenn ich das Script starte funktioniert dies einwandfrei, aber wenn ich es als App starte erscheint keine Nachricht.

Es liegt wohl daran, das die App nicht in den Bedienungshilfen (Systemeinstellungen - Sicherheit - Privatsphäre - Bedienungshilfen) eingetragen ist.

Da einige meiner Kollegen das App auch gerne nutzen würden, wollte ich das App innerhalb des Scripts in diese Bedienungshilfen eintragen.

mit

Code:
[FONT="Verdana"][size=2][b]tell[/b] [color=#0000FF][i]application[/i][/color] "System Events" [b]to[/b] [b]set[/b] [color=#6C04D4]UI elements enabled[/color] [b]to[/b] [color=#6C04D4][i]true[/i][/color][/size][/FONT]

geht es leider nicht, das gibt es ja bei Mavericks nicht mehr.

Ich hab mir schon nen Affen gegoogelt, aber leider nix gefunden.

Hat jemand ne Idee, wie ich das innerhalb des Scriptes bewerkstelligen kann?

Vielen Dank

Grüße

Micha
 
Hallo,

ich denke, folgendes wird dein Problem lösen:
Code:
display notification "Alle Laufwerke verbunden!" with title "Company mounting"
delay 1
(du kannst den Wert auch noch verringern: delay 0.5 reicht bestimmt auch schon)

Gruß
 
Hallo Veruna,

Danke für die Antwort.

Das hatte ich auch im Netz gelesen und eingebaut, löste mein Problem leider trotzdem nicht.

Ich habe dann das Script noch einmal neu als Programm Bundle gespeichert und dann gings. :confused:

Eine Frage noch, hier ging es ja jetzt nur um die Notification, die trägt sich ja automatisch in die Mitteilungszentrale ein.

Wie sieht es denn aber mit den Bedienungshilfen aus.

In diesem Script werden 2 bestimmte Laufwerke die verbunden wurden direkt in 2 verschiedenen Finder Fenstern angezeigt untereinander angezeigt. Hierzu ist allerdings der Zugriff über die Bedienungshilfen erforderlich (warum auch immer). es kommt eine Abfrage und die Systemeinstellungen werden geöffnet (macht das System selber). Hier muss dann der Haken beim Programm gesetzt werden.

Kann man DAS automatisieren und direkt im Script mit angeben?

Das Kennwort des Users wird am Anfang des Scripts schon angefragt (wegen dem mount der Volumes) liegt also dann schon vor.

Irgendeine Idee?

Danke

Grüße

Micha
 
Sofern immer gewisse Bedingungen erfüllt sind, könnte man das sogar theoretisch "automatisieren" ...
... aber schon allein die Idee ... würdest du das denn gutheissen, wenn ein Skript versuchen würde, in den Bereich Privatsphäre deiner Sicherheitseinstellungen einzudringen?

Gruß
 
Hallo varuna,

sorry, komme erst jetzt wieder dazu zu antworten...

es soll eigentlich nicht automatisiert ablaufen, ich möchte lediglich wissen, ist die App dort eingetragen oder nicht, wenn nicht, dann soll der Mac OSX eigene Hinweis kommen, das das "Hilfsprogramm" (so heißt es glaub ich in der Meldung) installiert werden muss. Der User kann dann selber entscheiden ob er das möchte oder nicht.

ich habe mal in der Bibliothek der System Events geschaut, konnte aber keine geeignete Suit finden, die dies ermöglicht.

Hast Du ne Idee wie ich das umsetzen kann?

Vielen Dank

Grüße

Micha
 
Hallo,

ich verstehe dein Anliegen leider nicht wirklich...
Falls ein App eine Berechtigung für den Zugriff auf die Bedienungshilfen braucht, so erscheint doch automatisch eine Meldung :confused:

Jedenfalls befinden sich die eingetragenen Apps in der Datenbank /Library/Application Support/com.apple.TCC/TCC.db, welche man auslesen könnte.
Und in dieser Datei befinden sich alle Apps, die nach einer Berechtigung gefragt haben:
~/Library/Preferences/com.apple.universalaccessAuthWarning.plist

Ich denke, am besten wäre es ja wohl, wenn dein Programm gar nicht erst Zugriff auf die Bedienungshilfen bräuchte, oder? Poste doch einfach mal deinen Code ... eventuell findet sich dann eine Lösung!

Gruß
 
Hallo Varuna,

im Grunde geht es darum, 2 Fenster der gerade aktiven App neben oder untereinander zu öffnen.

Vor Mavericks funktionierte dies einwandfrei, seit Mavericks benötigt die App Zugriff auf die Bedienungshilfen.

der Code ist für 2 Fenster neben einander (Cocoa Applescript Application):

Code:
[FONT="Verdana"][size=2][b]on[/b] [color=#3F7F00]btnAppsCol[/color]:[color=#3F7F00]sender[/color]
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "Finder"
		[b]copy[/b] [b]the[/b] [color=#6C04D4]bounds[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] [b]of[/b] [color=#6C04D4]desktop[/color] [b]to[/b] [color=#3F7F00]screenSize[/color]
		[b]set[/b] [color=#3F7F00]screenWidth[/color] [b]to[/b] (([color=#0000FF][i]item[/i][/color] 3 [b]of[/b] ([color=#3F7F00]screenSize[/color]) [b]as[/b] [color=#0000FF][i]number[/i][/color]) * 0.5 - 5)
		[b]set[/b] [color=#3F7F00]screenHeight[/color] [b]to[/b] (([color=#0000FF][i]item[/i][/color] 4 [b]of[/b] ([color=#3F7F00]screenSize[/color]) [b]as[/b] [color=#0000FF][i]number[/i][/color]) - 25)
	[b]end[/b] [b]tell[/b]
	
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "System Events"
		[b]set[/b] [color=#3F7F00]frontApp[/color] [b]to[/b] [color=#6C04D4]name[/color] [b]of[/b] [b]first[/b] [color=#0000FF][i]application process[/i][/color] [b]whose[/b] [color=#6C04D4]frontmost[/color] [b]is[/b] [color=#6C04D4][i]true[/i][/color]
		[b]set[/b] [color=#3F7F00]theWindow[/color] [b]to[/b] [b]get[/b] [color=#0000FF][b]count[/b][/color] [color=#0000FF][i]windows[/i][/color] [b]of[/b] ([b]first[/b] [color=#0000FF][i]application process[/i][/color] [b]whose[/b] [color=#6C04D4]frontmost[/color] [b]is[/b] [color=#6C04D4][i]true[/i][/color])
	[b]end[/b] [b]tell[/b]
	[b]if[/b] [color=#3F7F00]frontApp[/color] [b]is[/b] "Microsoft Excel" [b]or[/b] [color=#3F7F00]frontApp[/color] [b]is[/b] "Microsoft Word" [b]or[/b] [color=#3F7F00]frontApp[/color] [b]is[/b] "Microsoft PowerPoint" [b]then[/b]
		[b]tell[/b] [color=#0000FF][i]application[/i][/color] [color=#3F7F00]frontApp[/color]
			[b]set[/b] [b]the[/b] [color=#6C04D4]bounds[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] 1 [b]to[/b] {5, 25, [color=#3F7F00]screenWidth[/color], [color=#3F7F00]screenHeight[/color]}
			[b]set[/b] [b]the[/b] [color=#6C04D4]bounds[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] 2 [b]to[/b] {[color=#3F7F00]screenWidth[/color] + 5, 25, 2 * [color=#3F7F00]screenWidth[/color] + 5, 25 + [color=#3F7F00]screenHeight[/color]}
		[b]end[/b] [b]tell[/b]
	[b]else[/b]
		[b]if[/b] [color=#3F7F00]theWindow[/color] = 2 [b]then[/b]
			[b]tell[/b] [color=#0000FF][i]application[/i][/color] [color=#3F7F00]frontApp[/color]
				[b]try[/b]
					[b]set[/b] [b]the[/b] [color=#6C04D4]bounds[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] 1 [b]to[/b] {5, 2 * 25, [color=#3F7F00]screenWidth[/color], 25 + [color=#3F7F00]screenHeight[/color]}
					[b]set[/b] [b]the[/b] [color=#6C04D4]bounds[/color] [b]of[/b] [color=#0000FF][i]window[/i][/color] 2 [b]to[/b] {[color=#3F7F00]screenWidth[/color] + 5, 2 * 25, 2 * [color=#3F7F00]screenWidth[/color] + 5, 25 + [color=#3F7F00]screenHeight[/color]}
					[b]set[/b] [color=#6C04D4]miniaturized[/color] [b]of[/b] [b]every[/b] [color=#0000FF][i]window[/i][/color] [b]to[/b] [color=#6C04D4][i]false[/i][/color]
				[b]end[/b] [b]try[/b]
			[b]end[/b] [b]tell[/b]
			
		[b]else[/b]
			[color=#3F7F00]myNotification[/color]("Bitte 2 Fenster öffnen")
		[b]end[/b] [b]if[/b]
	[b]end[/b] [b]if[/b]
[b]end[/b] [color=#3F7F00]btnAppsCol[/color]:
[/size][/FONT]

das Problem ist, das OSX NICHT danach fragt, ob man den Zugriff erlauben möchte, es geht einfach nicht. Erst wenn die App in den Bedienungshilfen eingetragen ist, funktioniert es.

Daher würde ich gerne bei App start abfragen, ob die App eingetragen ist oder nicht, wenn nicht, dann soll OSX nach der Erlaubnis des Zugriffs fragen.

Grüße

Micha
 
Du kannst das herausfinden mit "UI Elements enabled". Steht aber auch in der Scriptbibliothek von System Events.
 
Ja na klar, so geht das :)

@MichaHo:
An Hand der Infos deines letzten Posts wird das Problem klar!

Falls bis dahin noch keine Lösung vorgeschlagen wurde, so melde ich mich heute Abend noch mal, wenn ich am Mac sitze.

Gruß
 
Also:

Braucht ein Programm Zugriff auf die Bedienungshilfen, wird beim -> erstmaligen Start gefragt, ob man den Zugriff erlauben möchte.
Zeitgleich wird -wie weiter oben schon erwähnt- in der ~/Library/Preferences/com.apple.universalaccessAuthWarning.plist ein Eintrag erstellt, dass gefragt wurde (bei Cocoa-AppleScript Applets sind es sogar drei Einträge - glaube ich).
-> Solange diese Einträge existieren, wird nicht erneut gefragt!

In deinem Programm passiert folgendes:
Applets, die ihre Eigenschaften sichern, ändern ihre eigenen Inhalte, um die Informationen zu sichern. Diese Selbständerung lässt OS X glauben, dass es sich bei jeder Ausführung der App um eine andere handelt. Dies löst den Autorisierungsprozess wiederholt aus.

Zitat siehe: diese Seite. Dort steht auch, wie du das Programm signieren kannst.

Ich würde also auf meinem Rechner erst mal die Einträge aus der Plist löschen, dann aus der Datenbank. Für letzteres gilt dieser Code:
Code:
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='dein.Bundle.Identifier';"
(bei dein.Bundle.Identifier die Kennung deines Programms eintragen)

Dann befolgst du die Vorgehensweise auf der verlinkten Seite und startest dein Programm.

PS: Diese Datenbank kannst du dir auch mal anschauen, dann siehst du, welche Programme wirklich alle Zugriff auf die Bedienungshilfen haben:
Code:
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db .dump > ~/Desktop/db.txt


Gruß
 
Hallo varuna und Pill,

Vielen Dank für die Hinweise.

Die Seite (varuna, dein Link) hatte ich mir auch schon angeschaut und versucht es umzusetzen.... wie gesagt, versucht 

da meine Kollegen auch mit der App arbeiten wollen, habe ich nicht ganz verstanden, wie ich es in der App selbst mit einbauen kann.

Der Tip von Pill hat mich dann aber auf nachfolgenden Code gebracht, mit der Variante kann ich und meine Kollegen leben...

Also, ich habe eine Funktion erstellt, die quasi den UI Elements enabled abfragt. ist die Antwort true, wird die App gestartet, ist sie false, wird die Systemeinstellungen- Sicherheit geöffnet und eine Box angezeigt, das der Haken vor der App zu setzen ist und die App dann neu gestartet werden muss.

meine ersten Tests haben funktioniert, werde es morgen mal meinen Kollegen verteilen und sehen was passiert.

hier nun der Code:
Code:
[FONT="Verdana"][size=2][b]if[/b] [color=#3F7F00]checkUIelements[/color]() [b]then[/b]
	[color=#0016B0][b]display dialog[/b][/color] "App wird gestartet"
[b]else[/b]
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "System Preferences"
		[color=#0000FF][b]activate[/b][/color]
		[b]set[/b] [color=#6C04D4]current pane[/color] [b]to[/b] [color=#0000FF][i]pane[/i][/color] [color=#6C04D4][i]id[/i][/color] "com.apple.preference.security"
		[color=#0016B0][b]display dialog[/b][/color] "Diese App benötigt den Zugriff auf die Bedienungshilfen der Systemeinstellungen. " & [color=#6C04D4]return[/color] & [color=#6C04D4]return[/color] & "Sie können diese in den Systemeinstellungen unter Sicherheit-Bedienungshilfen aktivieren, in dem Sie den Haken vor dieser App  bestätigen." & [color=#6C04D4]return[/color] & [color=#6C04D4]return[/color] & "starten Sie danach die App bitte neu" [color=#0016B0]with icon[/color] 1 [color=#0016B0]buttons[/color] {"OK"} [color=#0016B0]default button[/color] 1
	[b]end[/b] [b]tell[/b]
	[color=#0000FF][b]quit[/b][/color]
[b]end[/b] [b]if[/b]

[b]on[/b] [color=#3F7F00]checkUIelemnts[/color]()
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "System Events"
		[b]set[/b] [color=#3F7F00]UI_enabled[/color] [b]to[/b] [color=#6C04D4]UI elements enabled[/color]
	[b]end[/b] [b]tell[/b]
	[b]if[/b] [color=#3F7F00]UI_enabled[/color] [b]is[/b] [color=#6C04D4][i]false[/i][/color] [b]then[/b]
		[b]return[/b] [color=#6C04D4][i]false[/i][/color]
	[b]else[/b]
		[b]return[/b] [color=#6C04D4][i]true[/i][/color]
	[b]end[/b] [b]if[/b]
[b]end[/b] [color=#3F7F00]checkUIelemnts[/color][/size][/FONT]


Vielen Dank Euch beiden...

Grüße

Micha
 
Deine letzte Methode ist noch etwas umständlich, da reicht ein tell application "System Events" to return UI elements enabled ;)
 
Hallo,

super... danke für den Tip...

Grüße

Micha
 
Zurück
Oben Unten