在 COCOA 中以编程方式获取“GeneratedUID”

Posted

技术标签:

【中文标题】在 COCOA 中以编程方式获取“GeneratedUID”【英文标题】:Get "GeneratedUID" programmatically in COCOA 【发布时间】:2014-07-18 15:53:03 【问题描述】:

我正在尝试以编程方式获取系统 GeneratedUID,我可以使用“dscl .-search /Users GeneratedUID 00052AE8-5000-6000-9007-666F6B666A66”从命令行获取 UID

谁能帮助如何以编程方式获取此 GeneratedUID?

【问题讨论】:

检查这个 - ***.com/questions/10319275/… OS X 上的用户和组信息存储在目录服务中,OpenDirectory.framework (developer.apple.com/library/mac/documentation/networking/…) 提供了一个编程接口。 - 并且“dscl”是开源的 (opensource.apple.com/source/DSTools/DSTools-162/dscl) 所以应该给你一个起点。 【参考方案1】:

这对我有用。它返回为当前用户找到的第一个 GeneratedUID,如果没有找到,则返回 nil。

有很多错误需要处理,使得逻辑比实际应该的要复杂。

-(NSString*) getGeneratedUID 

    NSString* retval = nil;
    ODSession *mySession = [ODSession defaultSession];
    NSError *err;
    ODNode *myNode = [ODNode nodeWithSession:mySession type:kODNodeTypeAuthentication error:&err];
    NSString* username = NSUserName();

    ODQuery *myQuery = [ODQuery  queryWithNode: myNode
                                forRecordTypes: kODRecordTypeUsers
                                     attribute: kODAttributeTypeRecordName
                                     matchType: kODMatchEqualTo
                                   queryValues: username
                              returnAttributes: kODAttributeTypeStandardOnly
                                maximumResults: 0
                                         error: &err];

    if (err) 
        NSLog(@"Error creating current user query: %@", [err localizedDescription]);
    
    else 
        NSArray* queryResults = [myQuery resultsAllowingPartial:NO error:&err];

        if (err) 
            NSLog(@"Error executing current user query: %@", [err localizedDescription]);
        
        else 
            if ( [queryResults count] > 0 ) 

                ODRecord* firstQueryResult = [queryResults objectAtIndex:0];
                NSArray* uidValues = [firstQueryResult valuesForAttribute:@kDS1AttrGeneratedUID error:&err];

                if (err) 
                    NSLog(@"Error getting GeneratedUID attribute for current user: %@", [err localizedDescription]);
                
                else 
                    if ([uidValues count] > 0) 
                        retval = (NSString*) [uidValues objectAtIndex:0];
                    
                    else 
                        NSLog(@"No GeneratedUID values for current username: %@", username);
                    
                
            
            else 
                NSLog(@"No results from current user query for username: %@", username);
            
        
    

    return retval;

【讨论】:

【参考方案2】:

只需使用以下代码检索 UID....在添加代码之前导入 SecurityConfiguration.framework..

NSString* GetConsoleUser(uid_t* p_uid, gid_t* p_gid) 
  NSString* name = (NSString*)CFBridgingRelease(SCDynamicStoreCopyConsoleUser(
                                                          NULL, p_uid, p_gid));

  return name ;
 

您必须围绕字符串进行操作才能获得“UID”。

【讨论】:

以上是关于在 COCOA 中以编程方式获取“GeneratedUID”的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa - 在情节提要中以编程方式呈现 NSViewController LIKE “显示选项”(不是模态)

使用Cocoa以编程方式创建复选框

如何在 Swift 中以编程方式启用/禁用菜单对象

如何使用 Cocoa 以编程方式获取当前电池电量 [重复]

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

在android中以编程方式获取屏幕密度?