Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 是否可以替换Mac登录屏幕?_Cocoa_Macos_Login_Sfauthorizationpluginview - Fatal编程技术网

Cocoa 是否可以替换Mac登录屏幕?

Cocoa 是否可以替换Mac登录屏幕?,cocoa,macos,login,sfauthorizationpluginview,Cocoa,Macos,Login,Sfauthorizationpluginview,是否可以将Mac OS X登录窗口/System/Library/CoreServices/loginwindow.app替换为自定义登录窗口应用程序?() 恐怕我的可可编程技能还很初级。我确实觉得有趣的是,当我运行probe CGSession(即通过执行 nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession 其中一个链接函数是: (undefined [lazy bou

是否可以将Mac OS X登录窗口/System/Library/CoreServices/loginwindow.app替换为自定义登录窗口应用程序?()

恐怕我的可可编程技能还很初级。我确实觉得有趣的是,当我运行probe 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配置的一部分

理论上,你可以用自己的登录窗口来代替登录窗口,但我不知道你在新的应用程序中要做什么-我认为登录窗口比身份验证和设置用户会话->等做得更多,它看起来像是在做一些与启动相关的杂务

我编译了一个调用CGSCreateLoginSession的应用程序,一旦你运行它,它就会通过旋转立方体转换到登录窗口。我想这就是它需要CoreGraphics的原因——它只是一个在最后调用注销的图形函数

您可以尝试InputManager并查看它登录窗口加载代码->如果有,您可以更改LoginWindows NIB(LoginWindows Wui.NIB)并添加一些按钮,以使用用户浏览器显示新窗口。一旦学生选择了自己的图片,您就可以在LoginWindows中自动填充用户名和密码字段

#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;
}
这都是理论,看起来非常脆弱和不安全

祝你好运

以后编辑

请注意,这是非常不安全的,所以请小心使用-我在试用这种东西时用过几次软管连接我的系统

下面是一个概念验证实现,它在loginwindow中注入代码

#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;
}
代码加载基于插入,因此loginwindow的启动定义必须包含一个附加条目(以便在动态链接器中启用插入),即:

环境变量
动态插入库
指向/Desktop/libinterposers.dylib的路径

是的,您可以使用SFAuthorizationPluginView


您的“这样做的理由”似乎已失效(如“链接已失效”)很抱歉。我已经修复了链接。一切都是可能的。这取决于你想取消多少保修和EULA。嗨,也许你知道M1架构中是否仍然可以这样做吗?谢谢!@Zohar81,这个问题是近12年前提出来的。很可能你需要做的事情已经改变了。我从来没有去更换过即使在那时,登录屏幕也太多了。谢谢你提供的信息。看起来它只是Leopard(我也想支持Tiger)。苹果有一个“Name and Password”示例,上面有几个相关的问题,它们使用标签或“SFAuthorizationPluginView”()我不确定您是否可以轻松使用SFAuthorizationPluginView来更改登录窗口中的任何内容。我已经编译并安装了演示SFAuthorizationPluginView的名称和密码代码示例,在我看来,它允许您构建自定义权限(请参阅/etc/authorization以了解现有权限的定义->登录不在其中)。当应用程序要求操作系统为用户授权新创建的权限时,插件开始发挥作用。谢谢你,diciu。我不清楚你将如何(或是否可以)将其显示在登录屏幕上。[我编译了它,但不想在我自己的计算机上测试(并破坏!)授权。]我想也许我可以在system.login.console下的/etc/authorization中添加一些东西,以便在登录时触发插件,但我不清楚该添加什么。值得一提的是,我完全打破了我的登录窗口,弄乱了我的答案中提到的com.apple.loginwindow.plist,但我能够通过SSH登录。我有一个bootable外部驱动器(我使用SuperDuper!)这让我知道我总是可以通过Firewire启动并撤销破坏性的系统更改,从而弄乱了我的系统。哇,我很高兴再次投票给你。这同时也是难以置信和疯狂的。由于它相当先进,让我确保我正确理解了这个示例的功能:它将对“openlog”的调用替换为“my_openlog”这使得您的类LLApp假装为NSApplication类,因此可以修改对其函数的任何调用,并通过修改run函数以将某些内容输出到系统日志来证明这一点。函数替换可以通过插入-google来实现“插入mac os x”你会发现Amit Singh关于OS X的书中有一章描述了它是如何工作的。类姿势用于用类Y替换类X的所有实例-注意,64位上不支持它。至于替换-[NSApplication run]您可能不希望这样-您需要替换loginwindow应用程序中的某些内容,例如自定义视图类中的某些方法(您可以通过在Interface builder中打开包来找到自定义视图类的名称).看起来在不久的将来我无法分配时间来做这件事,但我肯定会给你正确的答案,感谢你付出的努力;我真的认为有了这个指导,任务是可以完成的。谢谢。
<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>