如何在MacOS 10.15中正确使用EndpointSecurity API?

如何在MacOS 10.15中正确使用EndpointSecurity API?,macos,Macos,我添加了权限并禁用了SIP:com.apple.developer.endpoint-security.client仍然获得ES\u NEW\u client\u RESULT\u ERR\u NOT\u allowed,如何使用 Xcode 11下的EndpointSecurity API是否正确?我是否需要以root身份运行 代码供您参考: #import <EndpointSecurity/EndpointSecurity.h> - (void)applicationDidF

我添加了权限并禁用了SIP:com.apple.developer.endpoint-security.client仍然获得
ES\u NEW\u client\u RESULT\u ERR\u NOT\u allowed
,如何使用 Xcode 11下的EndpointSecurity API是否正确?我是否需要以root身份运行

代码供您参考:

#import <EndpointSecurity/EndpointSecurity.h>

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    es_client_t *client;

    es_new_client_result_t res = es_new_client(&client, ^(es_client_t *client, const es_message_t *message) {
        NSLog(@"Hi");
    });

    if (res == ES_NEW_CLIENT_RESULT_SUCCESS){
        NSApplication.sharedApplication.keyWindow.contentView.layer.backgroundColor = NSColor.redColor.CGColor;
        NSLog(@"ES_NEW_CLIENT_RESULT_SUCCESS");
    }else if(res == ES_NEW_CLIENT_RESULT_ERR_INTERNAL){
        NSLog(@"ES_NEW_CLIENT_RESULT_ERR_INTERNAL");
    }else if(res == ES_NEW_CLIENT_RESULT_ERR_NOT_ENTITLED){
        NSLog(@"ES_NEW_CLIENT_RESULT_ERR_NOT_ENTITLED");
    }else if(res == ES_NEW_CLIENT_RESULT_ERR_NOT_PERMITTED){
        NSLog(@"ES_NEW_CLIENT_RESULT_ERR_NOT_PERMITTED");
    }else if(res == ES_NEW_CLIENT_RESULT_ERR_INVALID_ARGUMENT){
        NSLog(@"ES_NEW_CLIENT_RESULT_ERR_INVALID_ARGUMENT");
    }

    BOOL isSubscribeSuccess = es_subscribe(client, ES_EVENT_TYPE_NOTIFY_OPEN);
    if (isSubscribeSuccess == true){
        NSLog(@"isSubscribeSuccess");
    }else{
        NSLog(@"SubscribeErrpr");
    }

    }
#导入
-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知{
E_客户_t*客户;
es_new_client_result_t res=es_new_client(&client,^)(es_client_t*client,const Esu message_t*message){
NSLog(@“Hi”);
});
如果(res==ES\u新客户机\u结果\u成功){
NSApplication.sharedApplication.keyWindow.contentView.layer.backgroundColor=NSColor.redColor.CGColor;
NSLog(“新客户结果成功”);
}else if(res==ES\U新客户机\U结果\U错误\U内部){
NSLog(“新客户结果内部错误”);
}else if(res==ES\u NEW\u CLIENT\u RESULT\u ERR\u NOT\u){
NSLog(@“新客户结果错误未命名”);
}else if(res==ES\u新客户机\u结果\u错误\u不允许){
NSLog(“不允许出现新客户结果错误”);
}else if(res==ES\u NEW\u CLIENT\u RESULT\u ERR\u INVALID\u参数){
NSLog(@“新客户端结果错误无效参数”);
}
BOOL issubscribesuccessuccess=es_subscribe(客户端,事件类型,通知打开);
if(issubscribesuccessuccess==true){
NSLog(@“ISSUBSCRIBESSUCCESS”);
}否则{
NSLog(@“SubscribeErrpr”);
}
}
在应享权利方面:

    <key>com.apple.developer.endpoint-security.client</key>
    <true/>
com.apple.developer.endpoint-security.client

是的,您只需以root用户身份运行即可。 或者通过调整方案设置将调试进程设置为root。(产品>方案>编辑方案…)


根据
EndpointSecurity/ESTypes.h

///不允许调用方连接。缺乏透明度,, 用户的同意和控制(TCC)批准

因此,
ES_NEW_CLIENT_RESULT_ERR_NOT_allowed
表示您的流程未按使用EndpointSecurity API的要求获得用户的批准。
EndpointSecurity/ESClient.h
中的
es_new_client
文档说明:

调用此接口的应用程序也必须得到用户的批准 通过透明、同意和控制(TCC)机制,使用 “隐私首选项”窗格并将应用程序添加到完整磁盘 进入


当您从系统扩展调用EndpointSecurity API时,将自动出现一个询问用户权限的对话框。否则,用户必须允许手动使用它。顺便说一句,为了使用调用EndpointSecurity API的命令行工具进行测试,我必须将终端添加到完整的磁盘访问中。

如果我以root用户身份运行,我的应用程序会立即崩溃,可能是sandbox的问题?我想这个答案混淆了两个错误。以root用户身份运行的要求由
ES\u NEW\u CLIENT\u RESULT\u ERR\u NOT\u PRIVILEGED
表示。问题是关于另一个错误,
ES\u NEW\u CLIENT\u RESULT\u ERR\u NOT \u allowed