是否有可能取代Mac OS X的登录窗口,/System/Library/CoreServices/loginwindow.app,有一个自定义登录窗口应用程序吗? ( 见我这样做合理的 。)
我怕我的Cocoa编程技能是最基本的。 我觉得有趣的是,当我运行探测器CGSession(这是一个无证的实用工具,执行快速用户切换) ,看看它使用,这样做有什么功能
nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession
所链接的功能之一是:
(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)
我还没有发现在ApplicationServices框架文件。 我怀疑我越来越深入到服务提供商的接口,而不是应用程序接口。
我也觉得这很有趣的片段:( 谷歌缓存 )( 直接链接到页面下降 ;它出现在网站正在进行重新组织)从声称切换到即使快速用户切换是禁用的登录窗口的应用程序。
#include "CGSInternal.h"
int main (int argc, const char * argv[]) {
// switch to the login window
CGSCreateLoginSession(NULL);
return 0;
}
我把CG意味着CoreGraphics中,不明白是什么有伐木做(除了可能把登录在当前用户的工作对话框上)。
即使是不可能实现登录窗口的替代品,我很想知道什么可以沿着这些路线来完成(由谁不为苹果工作的人)。
登录窗口应用程序被定义为在所述/System/Library/LaunchDaemons/com.apple.loginwindow.plist的launchd配置的一部分。
从理论上讲,你可以换成你自己的登录窗口,但我不知道你在新的应用程序做什么 - 我想在登录窗口确实有点多,然后验证和建立用户会话 - >除其他外,它看起来像其做一些launchd的相关家务。
我编译调用CGSCreateLoginSession,一旦你运行它过渡到通过旋转立方体的登录窗口的应用程序。 我想这就是为什么它需要CoreGraphics中 - 它只是一个图形功能,在结束电话注销。
你可以尝试的输入管理,看看它的登录窗口中加载代码- >如果这样做,然后你可以改变登录窗口NIB(LoginWindowUI.nib),并添加一些按钮以显示与用户浏览器的新窗口。 一旦学生选择的他的照片/她,你可以自动填充在登录窗口中的用户名和密码字段。
节点这是所有理论,它看起来很脆弱和不安全。
祝好运。
后来编辑
尝试这种东西时,我没有我的软管系统中的几次-请注意,这是非常不安全的所以请谨慎使用
下面是在登录窗口注入代码证明了概念的实现。
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <strings.h>
#include <syslog.h>
#import <Cocoa/Cocoa.h>
#include <execinfo.h>
@interface LLApp:NSApplication
@end
@implementation LLApp
- (void)run
{
syslog(LOG_ERR, "LLApp being run");
[super run];
}
@end
void my_openlog(const char *ident, int logopt, int facility);
typedef struct interpose_s
{
void * new_func;
void * orig_func;
} interpose_t;
int MyNSApplicationMain(int argc, const char ** argv);
static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose"))) = {
{ (void *) my_openlog, (void *) openlog },
};
void my_openlog(const char *ident, int logopt, int facility)
{
openlog(ident, logopt, facility);
if(!strcmp(ident, "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"))
{
[LLApp poseAsClass:[NSApplication class]];
}
else
{
syslog(LOG_ERR, "Ignoring unknown indent: >%s<", ident);
}
return;
}
代码编译有:
gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa
代码加载基于插入所以登录窗口的定义的launchd必须包含一个额外的条目(以启用动态连接器插入),即:
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>path_to/Desktop/libinterposers.dylib</string>
</dict>
是的,你可以使用SFAuthorizationPluginView
在这里,在ADC的参考链接