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