Objective c 读取登录用户';OS X上的s域

Objective c 读取登录用户';OS X上的s域,objective-c,xcode,macos,terminal,dscl,Objective C,Xcode,Macos,Terminal,Dscl,有没有办法确定登录帐户是本地帐户还是OS X上的active directory帐户?如果是,我们如何检索域名 对我来说,代码是: NSMutableString *userDataDirectory = [[NSMutableString alloc] initWithString:NSHomeDirectory()]; NSLog(@"%@", userDataDirectory); 打印:/Users/jwlaughton 这就是您要找的吗?您可以根据用户的用户名为用户创建一个: CBU

有没有办法确定登录帐户是本地帐户还是OS X上的active directory帐户?如果是,我们如何检索域名

对我来说,代码是:

NSMutableString *userDataDirectory = [[NSMutableString alloc] initWithString:NSHomeDirectory()];
NSLog(@"%@", userDataDirectory);
打印:/Users/jwlaughton

这就是您要找的吗?

您可以根据用户的用户名为用户创建一个:

CBUserIdentity* identity = [CBUserIdentity identityWithName:NSUserName() authority:[CBIdentityAuthority defaultIdentityAuthority]];
然后,您可以获得该用户标识的:

然后,您可以查看这是否是本地机构(另一种选择是托管机构):

权威机构有一个
localizedName
属性,但我认为这不太可能包括域名。我不知道该怎么做


更新:

这是一种使用开放式目录API的方法:

ODSession* session = [ODSession defaultSession];
ODNode* node = [ODNode nodeWithSession:session type:kODNodeTypeAuthentication error:NULL];
ODQuery* query = [ODQuery queryWithNode:node forRecordTypes:kODRecordTypeUsers attribute:kODAttributeTypeRecordName matchType:kODMatchEqualTo queryValues:NSUserName() returnAttributes:kODAttributeTypeStandardOnly maximumResults:0 error:NULL];
NSArray* results = [query resultsAllowingPartial:NO error:NULL];
ODRecord* record = results.firstObject;
此时,您可以查询记录的某些属性。感兴趣的可能是
kODAttributeTypeMetaNodeLocation

NSArray* attributes = [record valuesForAttribute:kODAttributeTypeMetaNodeLocation error:NULL];
NSString* attribute = attributes.firstObject;
对于本地帐户,元节点位置应为“/local/Default”。我使用一个LDAP帐户进行了测试,结果显示为“/LDAPv3/my.LDAP.server.example.com”。我没有可用于测试的Active Directory帐户

或者,您可以尝试
kODAttributeTypeMetaRecordName
。对于返回
nil
的本地帐户。对于LDAP帐户,它给出了完全可分辨的名称:“uid=ken,ou=People,dc=example,dc=com”。同样,我不知道它对Active Directory帐户会做什么

您可以记录该记录以查看可用的其他属性。这将以字符串值的形式显示属性键。您可以查找并尝试查找该属性的符号常量或者检查/System/Library/Frameworks/OpenDirectory.framework/Frameworks/CFOpenDirectory.framework/Headers/cfopendirectorycontents.h,查看一些未记录的文件


一旦你找到了你真正关心的东西,你可以通过只请求那些来代替查询,而不是<代码> KoDATA ToTeType标准> <代码>。此外,你应该考虑异步地运行查询,而不是像我在示例代码中那样同步运行。现在正在使用OpenDirectory API,但苹果的官方文档非常糟糕:(你从哪里学的这些API?我如何使用Open Directory查询'memberOf'属性?谢谢你。我不记得我在哪里学的,确切地说。我很确定我只是因为这个问题才查阅了它们,尽管我在那之前就知道它们的存在。我以前对

dscl
comm有一些经验还有。这对交互式探索很有用。苹果的文档一直在稳步下滑。基于文档曾经更好的理论,我搜索了他们的遗留文档档案,发现了。不确定memberOf。可能是
kODAttributeTypeGroup
KodattributeTypeEntGroup
。但是,我用
dscl四处搜索
,我没有找到似乎显示辅助组的属性。(主,是的。)谢谢你及时的回复,我认为编程指南还不如你的清晰。谢谢你带我到dscl。我可以使用API IDirectorySearch从Windows查询'memberOf'属性,所以我想知道Mac上是否也一样。我很快会在这里尝试并反馈。最后它成功了。我仍然没有找到正式的KodattributeTypeeMemberOf类型,所以我硬编码了“memberOf”字符串:[record ValuesFrattribute:@“memberOf”error:NULL]它工作得很好,感谢您在这里指导我。:)
ODSession* session = [ODSession defaultSession];
ODNode* node = [ODNode nodeWithSession:session type:kODNodeTypeAuthentication error:NULL];
ODQuery* query = [ODQuery queryWithNode:node forRecordTypes:kODRecordTypeUsers attribute:kODAttributeTypeRecordName matchType:kODMatchEqualTo queryValues:NSUserName() returnAttributes:kODAttributeTypeStandardOnly maximumResults:0 error:NULL];
NSArray* results = [query resultsAllowingPartial:NO error:NULL];
ODRecord* record = results.firstObject;
NSArray* attributes = [record valuesForAttribute:kODAttributeTypeMetaNodeLocation error:NULL];
NSString* attribute = attributes.firstObject;