Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Macos Cocoa-强制用户切换?_Macos_Cocoa_Switch User - Fatal编程技术网

Macos Cocoa-强制用户切换?

Macos Cocoa-强制用户切换?,macos,cocoa,switch-user,Macos,Cocoa,Switch User,我正在构建一个mac应用程序,在特定时间,需要将当前登录的用户切换到不同的预设用户。本质上是一个修改过的登录窗口 有没有一种方法可以用可可粉来做到这一点 --阿里 编辑:有没有办法不要求用户输入密码?正如在回答类似问题时所解释的,系统文件夹中隐藏了一个名为“CGSession”的命令行工具,该工具可以执行您所需的操作。要在Cocoa应用程序中运行命令行工具,请查看NSTask 要直接切换用户,请通过运行“ID-u theUserName”查找预设用户的unix用户ID,然后将输出用作执行以下操作

我正在构建一个mac应用程序,在特定时间,需要将当前登录的用户切换到不同的预设用户。本质上是一个修改过的登录窗口

有没有一种方法可以用可可粉来做到这一点

--阿里


编辑:有没有办法不要求用户输入密码?

正如在回答类似问题时所解释的,系统文件夹中隐藏了一个名为“CGSession”的命令行工具,该工具可以执行您所需的操作。要在Cocoa应用程序中运行命令行工具,请查看NSTask

要直接切换用户,请通过运行“ID-u theUserName”查找预设用户的unix用户ID,然后将输出用作执行以下操作的参数:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID theUserIDNumber
或者只需进入登录窗口(不注销),运行:

下面是NSWorkspace的一个快速Obj-C类别

NSUSER.h:

#import <Cocoa/Cocoa.h>

@interface NSWorkspace (SwitchUser)
-(BOOL)switchToUser:(NSString *)userName;
@end
#导入
@界面NSWorkspace(SwitchUser)
-(BOOL)switchToUser:(NSString*)用户名;
@结束
NSUSER.m:

#import "NSWorkspace-SwitchUser.h"
#import <sys/types.h>
#import <pwd.h>
#import <stdlib.h>
#import <unistd.h>
#import <stdio.h>

@implementation NSWorkspace (SwitchUser)

-(BOOL)switchToUser:(NSString *)userName {
    struct passwd *pwd = malloc(sizeof(struct passwd));
    if (!pwd) {
        NSLog(@"Couldn't allocate struct passwd for getpwnam_r.");
        return FALSE;
    }

    size_t buf_len = sysconf(_SC_GETPW_R_SIZE_MAX) * sizeof(char);
    char *buffer = malloc(buf_len);
    if (!buffer) {
        NSLog(@"Couldn't allocate buffer for getpwnam_r.");
        return FALSE;
    }

    getpwnam_r([userName UTF8String], pwd, buffer, buf_len, &pwd);
    if (!pwd) {
        NSLog(@"getpwnam_r failed to find the requested user.");
        return FALSE;
    }

    uid_t userID = pwd->pw_uid;

    free(pwd);
    free(buffer);

    // Run CGSession with the -switchToUserID argument
    NSTask *cgsTask = [NSTask launchedTaskWithLaunchPath:@"/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" 
                                               arguments:[NSArray arrayWithObjects:@"-switchToUserID",[NSString stringWithFormat:@"%u",userID],nil]];

    // Wait till the task completes.
    // Should be able to use -[NSTask waitUntilExit] instead, but it wasn't working for me :-P
    while ([cgsTask isRunning]) {
        usleep(100000);
    }

    return ([cgsTask terminationStatus] == 0);
}

@end
#导入“NSWorkspace SwitchUser.h”
#进口
#进口
#进口
#进口
#进口
@实现NSWorkspace(SwitchUser)
-(BOOL)switchToUser:(NSString*)用户名{
struct passwd*pwd=malloc(sizeof(struct passwd));
如果(!pwd){
NSLog(@“无法为getpwnam_r.分配结构passwd”);
返回FALSE;
}
size_t buf_len=sysconf(_SC_GETPW_R_size_MAX)*sizeof(char);
char*buffer=malloc(buf_len);
如果(!缓冲区){
NSLog(@“无法为getpwnam_r分配缓冲区”);
返回FALSE;
}
getpwnam_r([userName UTF8String]、pwd、buffer、buf_len和pwd);
如果(!pwd){
NSLog(@“getpwnam_r未能找到请求的用户。”);
返回FALSE;
}
uid\u t userID=pwd->pw\u uid;
免费(pwd);
自由(缓冲);
//使用-switchToUserID参数运行CGSession
NSTask*cgsTask=[NSTask launchedTaskWithLaunchPath:@”/System/Library/CoreServices/Menu Extras/User.Menu/Contents/Resources/CGSession”
参数:[NSArray arrayWithObjects:@“-switchToUserID”,[NSString stringWithFormat:@“%u”,userID],nil]];
//等到任务完成。
//应该可以改为使用-[NSTask waitUntilExit],但它对我不起作用:-P
同时([cgsTask正在运行]){
美国LEEP(100000);
}
返回([cgsTask terminationStatus]==0);
}
@结束

编辑:如果您需要在不要求用户输入密码的情况下切换用户,似乎没有任何方法可以在没有AppleScript的情况下切换用户,而AppleScript在任何意义上都是不安全的。但是您可能会收集到您需要的信息。

正如在回答一个类似问题时所解释的,系统文件夹中隐藏了一个名为“CGSession”的命令行工具,它可以完成您需要的任务。要在Cocoa应用程序中运行命令行工具,请查看NSTask

要直接切换用户,请通过运行“ID-u theUserName”查找预设用户的unix用户ID,然后将输出用作执行以下操作的参数:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID theUserIDNumber
或者只需进入登录窗口(不注销),运行:

下面是NSWorkspace的一个快速Obj-C类别

NSUSER.h:

#import <Cocoa/Cocoa.h>

@interface NSWorkspace (SwitchUser)
-(BOOL)switchToUser:(NSString *)userName;
@end
#导入
@界面NSWorkspace(SwitchUser)
-(BOOL)switchToUser:(NSString*)用户名;
@结束
NSUSER.m:

#import "NSWorkspace-SwitchUser.h"
#import <sys/types.h>
#import <pwd.h>
#import <stdlib.h>
#import <unistd.h>
#import <stdio.h>

@implementation NSWorkspace (SwitchUser)

-(BOOL)switchToUser:(NSString *)userName {
    struct passwd *pwd = malloc(sizeof(struct passwd));
    if (!pwd) {
        NSLog(@"Couldn't allocate struct passwd for getpwnam_r.");
        return FALSE;
    }

    size_t buf_len = sysconf(_SC_GETPW_R_SIZE_MAX) * sizeof(char);
    char *buffer = malloc(buf_len);
    if (!buffer) {
        NSLog(@"Couldn't allocate buffer for getpwnam_r.");
        return FALSE;
    }

    getpwnam_r([userName UTF8String], pwd, buffer, buf_len, &pwd);
    if (!pwd) {
        NSLog(@"getpwnam_r failed to find the requested user.");
        return FALSE;
    }

    uid_t userID = pwd->pw_uid;

    free(pwd);
    free(buffer);

    // Run CGSession with the -switchToUserID argument
    NSTask *cgsTask = [NSTask launchedTaskWithLaunchPath:@"/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" 
                                               arguments:[NSArray arrayWithObjects:@"-switchToUserID",[NSString stringWithFormat:@"%u",userID],nil]];

    // Wait till the task completes.
    // Should be able to use -[NSTask waitUntilExit] instead, but it wasn't working for me :-P
    while ([cgsTask isRunning]) {
        usleep(100000);
    }

    return ([cgsTask terminationStatus] == 0);
}

@end
#导入“NSWorkspace SwitchUser.h”
#进口
#进口
#进口
#进口
#进口
@实现NSWorkspace(SwitchUser)
-(BOOL)switchToUser:(NSString*)用户名{
struct passwd*pwd=malloc(sizeof(struct passwd));
如果(!pwd){
NSLog(@“无法为getpwnam_r.分配结构passwd”);
返回FALSE;
}
size_t buf_len=sysconf(_SC_GETPW_R_size_MAX)*sizeof(char);
char*buffer=malloc(buf_len);
如果(!缓冲区){
NSLog(@“无法为getpwnam_r分配缓冲区”);
返回FALSE;
}
getpwnam_r([userName UTF8String]、pwd、buffer、buf_len和pwd);
如果(!pwd){
NSLog(@“getpwnam_r未能找到请求的用户。”);
返回FALSE;
}
uid\u t userID=pwd->pw\u uid;
免费(pwd);
自由(缓冲);
//使用-switchToUserID参数运行CGSession
NSTask*cgsTask=[NSTask launchedTaskWithLaunchPath:@”/System/Library/CoreServices/Menu Extras/User.Menu/Contents/Resources/CGSession”
参数:[NSArray arrayWithObjects:@“-switchToUserID”,[NSString stringWithFormat:@“%u”,userID],nil]];
//等到任务完成。
//应该可以改为使用-[NSTask waitUntilExit],但它对我不起作用:-P
同时([cgsTask正在运行]){
美国LEEP(100000);
}
返回([cgsTask terminationStatus]==0);
}
@结束

编辑:如果您需要在不要求用户输入密码的情况下切换用户,似乎没有任何方法可以在没有AppleScript的情况下切换用户,而AppleScript在任何意义上都是不安全的。但是您可能会收集到您需要的信息。

正如在回答一个类似问题时所解释的,系统文件夹中隐藏了一个名为“CGSession”的命令行工具,它可以完成您需要的任务。要在Cocoa应用程序中运行命令行工具,请查看NSTask

要直接切换用户,请通过运行“ID-u theUserName”查找预设用户的unix用户ID,然后将输出用作执行以下操作的参数:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID theUserIDNumber
或者只需进入登录窗口(不注销),运行:

下面是NSWorkspace的一个快速Obj-C类别

NSUSER.h:

#import <Cocoa/Cocoa.h>

@interface NSWorkspace (SwitchUser)
-(BOOL)switchToUser:(NSString *)userName;
@end
#导入
@界面NSWorkspace(SwitchUser)
-(BOOL)switchToUser:(NSString*)用户名;
@结束
NSUSER.m:

#import "NSWorkspace-SwitchUser.h"
#import <sys/types.h>
#import <pwd.h>
#import <stdlib.h>
#import <unistd.h>
#import <stdio.h>

@implementation NSWorkspace (SwitchUser)

-(BOOL)switchToUser:(NSString *)userName {
    struct passwd *pwd = malloc(sizeof(struct passwd));
    if (!pwd) {
        NSLog(@"Couldn't allocate struct passwd for getpwnam_r.");
        return FALSE;
    }

    size_t buf_len = sysconf(_SC_GETPW_R_SIZE_MAX) * sizeof(char);
    char *buffer = malloc(buf_len);
    if (!buffer) {
        NSLog(@"Couldn't allocate buffer for getpwnam_r.");
        return FALSE;
    }

    getpwnam_r([userName UTF8String], pwd, buffer, buf_len, &pwd);
    if (!pwd) {
        NSLog(@"getpwnam_r failed to find the requested user.");
        return FALSE;
    }

    uid_t userID = pwd->pw_uid;

    free(pwd);
    free(buffer);

    // Run CGSession with the -switchToUserID argument
    NSTask *cgsTask = [NSTask launchedTaskWithLaunchPath:@"/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" 
                                               arguments:[NSArray arrayWithObjects:@"-switchToUserID",[NSString stringWithFormat:@"%u",userID],nil]];

    // Wait till the task completes.
    // Should be able to use -[NSTask waitUntilExit] instead, but it wasn't working for me :-P
    while ([cgsTask isRunning]) {
        usleep(100000);
    }

    return ([cgsTask terminationStatus] == 0);
}

@end
#导入“NSWorkspace SwitchUser.h”
#进口
#进口
#进口
#进口
#进口
@实现NSWorkspace(SwitchUser)
-(BOOL)switchToUser:(NSString*)用户名{
struct passwd*pwd=malloc(sizeof(struct passwd));
如果(!pwd){