2013-07-17 10 views
34

10.9で補助デバイスへのアクセスをプログラムで有効にする。 10.8下で、私は補助装置にアクセス可能にするために、次のAppleScriptを使用していた:10.9で補助デバイスへのアクセスをプログラムで10.9を有効にする

tell application "System Events" 
if UI elements enabled is false then 
    set UI elements enabled to true 
end if 
end tell 

を、Appleはシステム環境設定➞セキュリティ&プライバシー➞プライバシー➞アクセシビリティへのアクセシビリティオプションを移動しました。 10.9の新機能は、すべてのアプリケーションにユニバーサルチェックボックスを使用した旧バージョンのOS Xとは異なり、ユーザーがさまざまなスクリプト機能を実行するためにシステムを制御できるアプリケーションを個別に選択できるようにします。

The new system preferences regarding accessibility

アップルは、プログラムでアプリのアクセシビリティを有効にするために開発者に任意のAPIを提供していません。 Mac OS 10.9では、アプリケーションがアクセシビリティAPIを使用しているときにアクセシビリティ機能を有効にするためのエンドユーザ権限のダイアログが表示されます。さらに、ユーザーはアクセシビリティを有効にした後にアプリケーションを再起動する必要があります。

Default prompt dialog put up by 10.9 OS for Xcode

我々はAppleScriptをまたは任意の他のAPIを使用して10.9にプログラムで補助装置にアクセスを可能にすることはできますか?この問題を解決するための助けをいただければ幸いです。

+5

いいえ、回避する方法はありません210クラスを生成することができるSBSystemPreferences.hファイルを形成していますこの画面にアクセスする必要性これは、オペレーティングシステムの基本保護の1つです。これを回避するために見つけられる方法は、ほぼ確実に修正されます。 – ChrisCM

+0

@ChrisCMユーザーがアプリケーションのアクセシビリティを有効にし、アプリケーションを再起動するよう促すことは受け入れられません。 – Vinpai

+1

私はこれが回避できない非常に意図的な行動だと信じています。アクセシビリティへのアクセス権があるときは、テキストボックスからテキストをコピーしたり、ランダムにクリックしたりできます。そのようなものは、いくつかのアプリケーションでは非常に便利ですが、ユーザーが知らなくてもそのようなことは起こりたくありません。しかし、これは明らかに物事をより安全なものにするためのサンドボックス作業の副作用です。 –

答えて

34

これは、あなたの質問に答えていないが、それは10.9に登場し、認証画面やバイパス、それを表示することができます新しいAPI呼び出しについて知って良いことだ:

NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @YES}; 
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options); 

YESを渡すと、認証を強制します画面が表示されると、NOが自動的にスキップされます。戻り値はAXAPIEnabled()によって返されたものと同じですが、10.9では非推奨です。 、機能がシステムに利用可能であることを確認してちょうどNULLにそれを比較するには:

if (AXIsProcessTrustedWithOptions != NULL) { 
    // 10.9 and later 
} else { 
    // 10.8 and older 
} 

あなたは、あなたのプロジェクトにApplicationServices.frameworkを追加する必要がありますし、あなたの.mまたは.hファイルのインポート:

許可画面では、ユーザーが直接アプリケーションを許可することはできませんが、システム環境設定の右側の部分が開きます。これは、ところで、あなたは役に立たないシステムとの対話を経由せずに直接行うことができます。

tell application "System Preferences" 
    set securityPane to pane id "com.apple.preference.security" 
    tell securityPane to reveal anchor "Privacy_Accessibility" 
    activate 
end tell 

やObjective Cのを使用して:

NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"; 
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]]; 

これは、かどうかをテストするための最初のコードスニペットとペアにすることができaccessibilityEnabled表示されるように、システムのポップアップを防止しながらkAXTrustedCheckOptionPrompt@NOを渡して、代わりに開くことによって、アクセシビリティの好みが直接ペイン:

NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @NO}; 
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options); 
if (!accessibilityEnabled) { 
    NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"; 
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]]; 
} 
+0

「AXIsProcessTrustedWithOptions」は10.9で導入されたと思いましたか?したがって、上記のコードでは、少なくともこれをコンパイルするには10.9をターゲットにする必要はありませんか?あるいは10.9を対象とする条件付きコードブロックで使用しますか? –

+0

ahh ....私は今見ている - 弱いリンク;-) http://stackoverflow.com/questions/17193066/cocoa-check-if-function-exists/17205070#17205070 –

+0

@BradParks最終的なコード弱いリンクで使用されますか?そして、これをARCでコンパイルする正しい方法を投稿することができますか?注:コンパイルするには、 'ApplicationServices.framework'をプロジェクトに追加し、' #import '行をコードに追加する必要があります。 –

8

TCC.dbファイルを直接編集できます。 Divvyをユーザーとのやりとりなしにインストールするには、これを行う必要がありました。 com.mizage.divvyをプログラムに置き換えてください。

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES('kTCCServiceAccessibility','com.mizage.divvy',0,1,1,NULL);" 

エントリを削除するには:

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.mizage.divvy';" 
+1

+1、これはMac App Store経由で配布されるサンドボックスアプリケーションでは機能しませんが、 (とにかく、私は物事を明確にしようとしています)また、あなたは 'TCC.db'についてどこで学びましたか? – zoul

+0

再起動する必要はありますか? – jamespick

+0

いいえ、再起動は必要ありません –

0

sqlite3の "ハック" は素晴らしいです。

私はこの作業を行うために、 "1,1,1"(それが何であれ)を使用しなければなりませんでした。

クライアント(プログラム名)ではなく、アクセス権の組み合わせが一意のデータベースキーであることに注意してください。

0

ありがとうございました。

私は制御を保証するために、ログインウィンドウからトリガ以下のみ、我々はすべてのセッションをしたい項目に与えられている発行

# Enable Service Accessibility for Textpander and others 
# Clear the acess table. 
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "DELETE FROM access" 

# Enter the access we wish to have. 
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES ('kTCCServiceAccessibility','com.apple.systempreferences',0,1,1,NULL)" 
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES ('kTCCServiceAccessibility','de.petermaurer.textpanderdaemon',0,1,1,NULL)" 
9

@ user2865860の答えはうまく動作しますが、私は全体のコードを投稿したいのに残りの時間を節約するために10.9で完全に動作するサンプル。 root権限を取得する必要があるため、パスワードの入力を求めるプロンプトが表示されます。

char *command= "/usr/bin/sqlite3"; 
char *args[] = {"/Library/Application Support/com.apple.TCC/TCC.db", "INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','com.yourapp',0,1,0,NULL);", nil}; 
AuthorizationRef authRef; 
OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef); 
if (status == errAuthorizationSuccess) { 
    status = AuthorizationExecuteWithPrivileges(authRef, command, kAuthorizationFlagDefaults, args, NULL); 
    AuthorizationFree(authRef, kAuthorizationFlagDestroyRights); 
    if(status != 0){ 
     //handle errors... 
    } 
} 
+2

以降はこれを明確にするために、_CREATE TABLEアクセス(サービスTEXT NOT NULL、クライアントTEXT NOT NULL、クライアントタイプINTEGER NOT NULL、許可INTEGER NOT NULL、prompt_count INTEGER NOT NULL、csreq最初の0は "client_type"、バイナリを参照する場合は1、バンドル名を参照している場合は0と思われます。次は有効になっていますが、これは1になります。最終的なのはprompt_count、いいえ考えません:) –

+2

シエラの時点では、これはもう機能しません。データベースファイルは、rootでも読み取り専用になりました。 OSの「システム・インテグリティ・プロテクション」(https://support.apple.com/en-us/HT204899)をオフにしてから、そのファイルを再度書き込み可能にすることはできますが、これは必ずしも推奨されるものではありません。あなたがMac Appでこれを行うようにした場合、App Reviewを通過しました。 –

1

@NightFlightのこのシェルスクリプトサンプルは本当に役に立ちます。私はこれを次のようなPythonアプリケーションでAppleScriptで使用しました:

set sh to "touch /private/var/db/.AccessibilityAPIEnabled && sqlite3 \\"/Library/Application Support/com.apple.TCC/TCC.db\\" \\"INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','com.godevnode',0,1,0,NULL);\\"" 
do shell script sh with administrator privileges 

Pythonコードでは文字列としてうまく機能しました。

編集(2014年11月7日):

あなたは以下のようにわずかに異なる文字エスケープを使用し、AppleScriptのエディタでこれを試してみたい場合:

set sh to "touch /private/var/db/.AccessibilityAPIEnabled && sqlite3 \"/Library/Application Support/com.apple.TCC/TCC.db\" \"INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','com.godevnode',0,1,0,NULL);\"" 
do shell script sh with administrator privileges 

のMac OS X 10.9の前に、それはですさらに簡単に:

accessibility_api_file = "/private/var/db/.AccessibilityAPIEnabled" 

def __enable_accessibility_api(): 
    try: 
     script = 'do shell script "touch %s" with administrator ' \ 
       'privileges' % accessibility_api_file 
     result = applescript.AppleScript(script).run() 
     log.debug("Tried to enable accessibility api, result=" + result) 
     return True 
    except applescript.ScriptError as err: 
     log.error(str(err)) 
    return False 

ただ1つのファイルをタッチするだけです。上記のPythonコードで言及されているAppleScriptは、他の言語でも使用できます。私はこれで自分を苦労して、研究のビットの後、私は次を発見した

+0

これをAppleScriptエディタにコピーして貼り付けましたが、「この識別子の後に未知のトークンはありません」と表示され、「com.apple」に「com.」がハイライト表示されます。 AppleScript Editorのコードを共有してください。これは10.9と互換性がありますか? – Noitidart

+1

文字エスケープの問題のようです。 AppleScriptエディタでこれを試してみてください:shを "touch /private/var/db/.AccessibilityAPIEnabled && sqlite3 \"/Library/Application Support/com.apple.TCC/TCC.db \ "\"に設定してください。 "kTCCServiceAccessibility"、 "com.godevnode '、0,1,0、NULL); \" " 管理者権限でシェルスクリプトを実行してください –

+0

ありがとうございます。私は、AppleScriptを開いて編集します。私は今週と来週は本当に忙しいので、おそらく2週間ほどしてください。 – Noitidart

2

  1. ハッキングのsqliteのDBは、認証サービスを使用する際の主な欠点を持っています。最初に、これはアプリケーションがユーティリティヘルパーをインストールしたいというダイアログをポップアップ表示します(SMJobSubmitを使って起動したものだけでも)。 2つめは、サンドボックスアプリでは機能しないため、アプリストアがありません。

  2. @Max Al Faeakhは、非推奨のAuthorizationExecuteWithPrivilegesを使用します。上記のSMJobSubmitでlaunchdを使用する必要があります。とにかく、これにはまだ認可が必要です。また、このような補助アプリケーションが必要ですone。手動例スクリプトブリッジフレームワークの使用

    NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @YES}; 
    BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options); 
    

    又は

    NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @NO}; 
    BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options); 
    

    とオープン環境設定パネル:

私は最良のいずれかを使用することで推測

SBSystemPreferencesApplication *prefs = [SBApplication applicationWithBundleIdentifier:@"com.apple.systempreferences"]; 
[prefs activate]; 

SBSystemPreferencesPane *pane = [[prefs panes] find:^BOOL(SBSystemPreferencesPane *elem) { 
    return [[elem id] isEqualToString:@"com.apple.preference.security"]; 
}]; 
SBSystemPreferencesAnchor *anchor = [[pane anchors] find:^BOOL(SBSystemPreferencesAnchor *elem) { 
    return [[elem name] isEqualToString:@"Privacy_Accessibility"]; 
}]; 

[anchor reveal]; 

私はきちんとOS X 10.9でのアクセシビリティの権限を要求し、次のコードスニペットを発見した

sdef "/Applications/System Preferences.app" | sdp -fh --basename SBSystemPreferences -o SBSystemPreferences.h 
6

if (AXIsProcessTrustedWithOptions != NULL) { 
    // 10.9 and later 
    const void * keys[] = { kAXTrustedCheckOptionPrompt }; 
    const void * values[] = { kCFBooleanTrue }; 

    CFDictionaryRef options = CFDictionaryCreate(
      kCFAllocatorDefault, 
      keys, 
      values, 
      sizeof(keys)/sizeof(*keys), 
      &kCFCopyStringDictionaryKeyCallBacks, 
      &kCFTypeDictionaryValueCallBacks); 

    return AXIsProcessTrustedWithOptions(options); 
} 

// OS X 10.8 and older