こちらの続き
ヘルパーツールをインストールするための許可を作成
成功したらauthRefに参照が却ってくる。
var authRef :AuthorizationRef?
var flags = AuthorizationFlags( rawValue : 0)
var status = AuthorizationCreate(nil, nil, flags, &authRef);
ヘルパーツールをインストールするための権限を要求
成功したらauthRightsが却ってくる。
var authItem = AuthorizationItem(name: kSMRightBlessPrivilegedHelper, valueLength: 0, value: nil, flags: 0 )
var authRights = AuthorizationRights( count: 1, items: &authItem )
# セキュリティサーバーに必要な許可を与えるフラグを作成
必要なものは以下の3プロパティ。
-
interactionAllowed
ユーザーとの対話を許可 -
extendRights
要求された権限(ここではヘルパーツールインストール)を許可 -
preAuthorize
要求された権限を事前承認できるように
flags = AuthorizationFlags([.interactionAllowed, .extendRights, .preAuthorize])
管理者ユーザー認証を行う
AuthorizationCopyRightsの呼び出しに成功したら「xxxが新しいヘルパーツールを追加しようとしています。許可するにはパスワードを入力してください」というダイアログが表示される。
status = AuthorizationCopyRights(authRef!, &authRights, nil, flags, nil)
ヘルパーツールをlaunchdにジョブ登録する
管理者ユーザーで認証されたのち、ヘルパーツールのインストール許可が下りる。
SMJobBlessを呼び出してインストールを実施。
bundleidが登録したいヘルパーツールのbundleid。
SMJobBless(
kSMDomainSystemLaunchd,
bundleid as CFString,
authRef,
&cfError)
一度インストールしたら、ヘルパーツールが自動的に動作するようになる。
以下のファイルの存在有無でインストールが必要かどうか判断しても良いだろう。
/Library/LaunchDaemons/<bundleid>.plist
/Library/PrivilegedHelperTools/<bundleid>
このあとはipcによりヘルパーツール側の処理を呼び出すことで、毎回管理者ユーザー認証を求められずに特権処理を行うことができる。
お疲れ様でした。