在OS X上读取登录用户的域

时间:2014-12-31 11:38:56

标签: objective-c xcode macos terminal dscl

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

2 个答案:

答案 0 :(得分:3)

您可以通过用户名为用户创建CBUserIdentity

CBUserIdentity* identity = [CBUserIdentity identityWithName:NSUserName() authority:[CBIdentityAuthority defaultIdentityAuthority]];

然后,您可以获得该用户身份authority

CBIdentityAuthority* authority = identity.authority;

然后,您可以看到这是否是本地权限(替代方案是托管权限):

if ([authority isEqual:[CBIdentityAuthority localIdentityAuthority])
{
    // user is local
}
else
{
    // user is managed
}

该权限具有localizedName属性,但我不太可能包含域名,我不这么认为。我不知道该怎么做。


<强>更新

这是一种使用Open Directory 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;

对于本地帐户,元节点位置应为&#34; / Local / Default&#34;。我使用LDAP帐户进行了测试,并提供了&#34;&#34; /LDAPv3/my.ldap.server.example.com"。我没有要测试的Active Directory帐户。

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

您可以记录记录以查看可用的其他属性。这将把属性键显示为字符串值。你可以看here试图找到感兴趣的符号常量,或者查看/System/Library/Frameworks/OpenDirectory.framework/Frameworks/CFOpenDirectory.framework/Headers/CFOpenDirectoryConstants.h没有记录。

一旦找到了您真正关心的内容,您可以通过仅请求kODAttributeTypeStandardOnly而不是{{1}}来简化查询。此外,您应该考虑异步运行查询,而不是像我在示例代码中那样同步运行查询。

答案 1 :(得分:0)

对我来说代码:

NSMutableString *userDataDirectory = [[NSMutableString alloc] initWithString:NSHomeDirectory()];
NSLog(@"%@", userDataDirectory);

打印:/ Users / jwlaughton

这是你正在寻找的吗?