我想在Mac OS X上授权USB / CD。现在我使用DiskArbitration框架将MountApprovalCallback置于用户模式。但这次回调的问题在于无法保证。
如果我得到回调,我使用CFUserNotificationReceiveResponse()
来接受用户的密码。
但是当同时显示提示时,用户可以打开DiskUtility并可以挂载设备
所以,
提前致谢。
答案 0 :(得分:1)
在kext中,您可以通过MAC(TrustedBSD)策略框架中的mpo_mount_check_mount
回调获取文件系统挂载回调的授权回调。您可以决定是否应该在那里进行安装。我怀疑你不会从cred
参数获得有关登录用户的任何信息,因为mount syscall可能是以root用户身份运行的守护进程启动的。我不知道你实际尝试做什么,所以这可能不是针对你的具体案例解决问题的最好方法。
/**
@brief Access control check for mounting a file system
@param cred Subject credential
@param vp Vnode that is to be the mount point
@param vlabel Label associated with the vnode
@param cnp Component name for vp
@param vfc_name Filesystem type name
Determine whether the subject identified by the credential can perform
the mount operation on the target vnode.
@return Return 0 if access is granted, otherwise an appropriate value for
errno should be returned.
*/
typedef int mpo_mount_check_mount_t(
kauth_cred_t cred,
struct vnode *vp,
struct label *vlabel,
struct componentname *cnp,
const char *vfc_name
);
请注意,这是不支持的 KPI,因此Apple表示它可能会在将来的版本中消失或中断。实际上,策略回调函数签名在主要OS X版本之间经常发生变化,因此您可能需要在运行时检查OS X版本并针对不同版本使用不同的函数。您还需要及时了解Apple发布的任何测试版,以确定它们是否会破坏您的代码。
有了这个,这就是你实际使用它的方式:
com.apple.kpi.dsep
添加到您的kext的OSBundleLibraries字典中。 (它使用darwin版本,因此使用与其他com.apple.kpi。*包相同的版本)#include <security/mac_policy.h>
(已在Kernel.framework中提供)struct mac_policy_ops
,并初始化您感兴趣的任何函数指针字段,例如: mpo_mount_check_mount
。mac_policy_register()
注册你的策略并保存它返回的句柄。您需要使用mac_policy_conf
结构来配置您的政策,您可以将mpc_ops
设置为指向您的政策结构,mpc_loadtime_flags
指向MPC_LOADTIME_FLAG_UNLOADOK
,mpc_name
至您的kext的反向DNS标识符,mpc_fullname
到人类可读的字符串,并将其他所有内容归零。mac_policy_unregister()
以及您从mac_policy_register()
收到的句柄取消注册。可以找到更多信息in the header file。