检查用户是否为本地或域帐户

时间:2015-12-02 16:13:41

标签: c++ objective-c c macos active-directory

考虑到OS X中用户的名称,可以使用BSD membership functions查询其Active Directory SID。

但是,如果在不是目录成员的计算机上提供本地用户名,则还会返回SID。

提供了用于检查本地登录用户是否为域帐户的解决方案here,但这假设有问题的用户是当前会话的用户,可能不是这种情况。此外,如果用户是移动帐户(漫游),则会找到主目录并且返回错误。

那么,如何检查给定的用户名是本地用户还是域用户,用户名可以是任何名称,包括用于本地进程的名称?

1 个答案:

答案 0 :(得分:0)

使用 OpenDirectory API我设法完成了类似的任务,以下是适合您查询的修改后的解决方案:

bool isDomainUser(std::string currentUser)
{
    NSString *queryVal = [NSString stringWithUTF8String:currentUser.c_str()];

    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:queryVal
                        returnAttributes:kODAttributeTypeStandardOnly
                        maximumResults:0 error:NULL];

    NSArray *records = [query resultsAllowingPartial:NO error:NULL];

    for (ODRecord *record in records)
    {
        ODAttributeType type = @"dsAttrTypeStandard:OriginalAuthenticationAuthority";
        NSArray *lines = [record valuesForAttribute:type error:nil];

        if (lines)
        {
            for(NSString *line in lines)
            {
                if ([line hasPrefix:@"NetLogon"])
                {
                    return true;
                }
            }
        }
    }

    return false;
}