有線 LAN で接続した Mac を遠隔操作。一回目は、前準備。二回目は、スクリプトを書いて Mac を動かしました。今回は、前回提起された問題。認証ダイアログの抑制について。
そもそも、パスワードやユーザ名などは、Mac の場合「キーチェーンアクセス」というアプリケーションが一括管理してくれます。もちろん、リモート AppleEvent でのホスト側のこういった情報も管理してくれています。
キーチェーンアクセスは、/Application/Utilities/ にあります。起動します。デフォルトの設定を変えていないなら、ログインというキーチェーンがあると思います。前回のスクリプトを実際に試してみたなら、ホスト側の名前がついたインターネットパスワードという種類のキーがあると思います(この場合、iBook800.local)。ない場合は、作成してください(作成方法は割愛)。
これを選択するとキーチェーンアクセスのウィンドウ上部に情報が表示されると思います。アカウント(ユーザー名)と場所(eppc://iBook800.local:3031)が書かれています。前回、ホストを指定するのに eppc://iBook800.local しか指定していませんでした。最後のコロン以下の 3031 は、リモート AppleEvent が利用するポート番号です。
キーチェーンアクセスにこうやって保存されているなら、AppleScript では「Keychain Scripting」というバックグラウンドアプリケーションを使ってキーチェーンや登録されているキーの情報を取得することができます。
ここで問題が出てきます。Mac OS X 10.3 と 10.4 の Keychain Scripting は、バグがあってそのままではすんなりと利用できません。10.4.2 のアップデータでなおったとありますが、本当はなおっていません。この問題を回避するためにアップルは情報を公開しています。しかし、ここで紹介されているスクリプトを試してもエラーになります。というのも、このスクリプト自体が間違っているから。
Keychain Scripting は、パスワードを要求されると「Keychain Scripting でエラーが起きました:アプリケーションは実行されていません。」とエラーが表示されます。これが、Keychain Scripting のバグです。
tell application "Keychain Scripting"
password of key 1 of keychain 1
end tell
-- Keychain Scripting でエラーが起きました:アプリケーションは実行されていません。
なぜ、こんなエラーが起きるかの原因は分からないですが、次のような手順で回避できます。(1) Keychain Scripting が起動しているなら、一度終了させる。(2) Finder で開く。アップルも同じような解決方法を掲載しているわけですが、(1) の部分に問題がありそのままでは利用できないものになっています。
掲載されているものでは System Events で Keychain Scripting のプロセスを調べて System Events の中で Keychain Scripting を終了させています。
tell application "System Events"
quit targetApp
end tell
これが間違い。System Events ではアプリケーションを指定して終了させることはできません。結果、プロセスはそのまま残るので再度エラーになります。まずは、このバグを回避するために次のようなスクリプトを作成します。
on run
startKeychainScripting()
tell application "Keychain Scripting"
password of key 1 of keychain 1
end tell
end run
on startKeychainScripting()
-- Keychain Scripting の起動確認
tell application "System Events" to set bool to exists process "Keychain Scripting"
-- 起動しているなら終了
if bool then
keychainScriptingKiller()
-- System Events からプロセスが見えなくなるまで
--これがないと Finder でエラーが発生する
repeat
tell application "System Events" to set bool to exists process "Keychain Scripting"
if not bool then exit repeat
end repeat
end if
-- Keychain Scripting の再起動
restartKeychainScripting()
end startKeychainScripting
on restartKeychainScripting()
-- kscr は、Keychain Scripting のクリエータータイプ
-- com.apple.KeychainScripting でも可
-- Finder で Keychain Scripting を起動
tell application "Finder" to open application file id "kscr"
-- System Events からプロセスが見えるようになるまで
--これがないと次の処理でエラーになる
repeat
tell application "System Events" to set bool to exists process "Keychain Scripting"
if bool then exit repeat
end repeat
end restartKeychainScripting
on keychainScriptingKiller()
tell application "Keychain Scripting" to quit
end keychainScriptingKiller
いつもよりコメントを多めにしています。安全のために Keychain Scripting を利用する度に「終了/Finder で開く」の処理を行っておきます。
これが他の環境でも動くかどうか分からないですが。シェルを使っての起動、終了でもいいと思います。もし、動かない場合はシェルでやってみるといいかもしれません。
しかし、キーチェーンを利用するまでに時間がかかりますね...。