Cocoa 如何获取通过Active Directory登录Mac的用户的域名

Cocoa 如何获取通过Active Directory登录Mac的用户的域名,cocoa,macos,active-directory,Cocoa,Macos,Active Directory,在我的Cocoa应用程序中,当当前用户通过Active Directory登录时,如何获取其域 我需要确定两件事: 如果当前用户登录到Active Directory域(只需要处理Active Directory) 如果为1,则为用户的域 我找到了对和的引用,但后者仅为10.6(我必须支持10.5+),我找不到任何关于前者的示例,这些示例让我知道我需要做什么。dsconfigad-show 它将告诉您是否已绑定到某个目录,以及该目录的详细信息(如果已绑定)。然后您将知道如何编写dscl脚本。我认

在我的Cocoa应用程序中,当当前用户通过Active Directory登录时,如何获取其域

我需要确定两件事:

  • 如果当前用户登录到Active Directory域(只需要处理Active Directory)
  • 如果为1,则为用户的域
  • 我找到了对和的引用,但后者仅为10.6(我必须支持10.5+),我找不到任何关于前者的示例,这些示例让我知道我需要做什么。

    dsconfigad-show


    它将告诉您是否已绑定到某个目录,以及该目录的详细信息(如果已绑定)。然后您将知道如何编写dscl脚本。

    我认为您可以使用与此处相同的想法:


    您只需查找网络或身份验证节点(它是kODNodeTypeAuthentication类型),并在其中查询kODAttributeTypeRecordName,查询值设置为当前用户名。然后查看搜索结果,您会在那里发现许多有趣的东西:)

    您可以使用此代码,但请注意,我假设您指的是运行当前应用程序的用户,如果您以root用户身份运行,则它将不起作用。 如果以root用户身份运行,只需将查询中的NSUserName()更改为要查询的所需用户

    std::string getDomainForCurrentUser()
    {
        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 *records = [query resultsAllowingPartial:NO error:NULL];
    
        for (ODRecord *record in records)
        {
            NSArray *recordLines = [record valuesForAttribute:kODAttributeTypePrimaryNTDomain error:nil];
    
            if (recordLines)
            {
                NSString *domain = [recordLines firstObject];
                std::string([domain UTF8String]);
    
            }
        }
    
        return "";
    }
    

    谢谢这是一个很好的开始,它确实让我知道了计算机绑定到的域的名称。如果使用sudo,则不需要指定本地凭据(对于以编程方式使用dsadminad很重要)。现在有没有办法判断当前登录的用户是域用户还是本地帐户?到目前为止,我还没有找到一个办法。如果有办法的话,我会很乐意接受你的回答。在我反复思考之后,这个问题让我试着用手指触摸不同的用户,在我的测试机器上至少可以看到广告用户没有
    名称(他们有
    登录名,但没有全名)。我想要一个更健壮的机制,但如果进一步的测试和研究表明这是一个相当可靠的方法,它可能就足够了。我发现至少有一种情况,通过Active Directory登录的用户有一个完整的用户名,所以这将不起作用。还在找呢。@LawrenceJohnston你找到解决办法了吗?我想弄清楚同样的事情。我有解析dsconfigad-show输出的代码。。。但即使以未连接到域的用户身份运行,也包括Active Directory域。@blak3r不,我没有。其他事情的优先级更高,到目前为止还不够重要。如果你找到了答案,请分享!祝你好运