为什么具有域上下文的 FindByIdentity 忽略参数中的本地机器名称?

蒂莫西·约翰·莱尔德

所以我有这个字符串:

testvm\Administrator

我的机器主机名是“testvm”,我使用具有该名称的域上下文调用 FindByIdentity。问题是 FindByIdentity 正在返回管理员帐户(我知道,因为它具有该域帐户的非空 UPN,而本地帐户不能具有 UPN)。那么为什么它会忽略字符串的主机名部分呢?FindByIdentity 不应该返回 null 因为我特意把那台机器主机名放在那里吗?这是我的代码:

    private bool GetPrincipalFromName_IsDomain(string sName, out Principal userPrincipal)
    {
        bool bIsDomain = false;
        userPrincipal = null;
        PrincipalContext pcontextDomain = null;

        try
        {
            pcontextDomain = new PrincipalContext(ContextType.Domain);
        }
        catch (Exception ex)
        {
            throw new Exception("Unable to Initialize Domain Context", ex);
        }

        try
        {
            userPrincipal = Principal.FindByIdentity(pcontextDomain, sName);
            if(userPrincipal != null)
            {
                bIsDomain = true;
            }
        }
        catch(MultipleMatchesException mmEx)
        {
            throw new Exception(string.Format("Found more than one Principal on Domain using Name '{0}'. Use a more precise domain name.", sName), mmEx);
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Unable to Find Principal on Domain using Name '{0}'.", sName), ex);
        }

        return bIsDomain;
    }

我能找到的唯一解决方法是传入:

testvm\\Administrator

然后 FindByIdentity 在域上下文中返回 null,如果我用本地上下文调用它,则返回非 null。为什么?

蒂莫西·约翰·莱尔德

好吧,我没有完全掌握:

  1. 具有域上下文的 PrincipalContext 构造函数假定本地域。如果您不想假设一个域,则必须明确地告诉它在下一个参数中是哪个域。在机器上下文的情况下,您必须让它假设本地机器或在下一个参数中指定您想要的机器。

  2. FindByIdentity 方法不关心斜线之前的任何内容。FindByIdentity 查找一种身份类型 (IdentityReference) 并默认为“名称”,即用户或组名称。它需要用户或组的名称,除非您指定不同类型的身份(如 SID),在这种情况下,它会在该上下文中查找 Principal。因此,在我的 'domain\jlaird' 情况下,它忽略了斜线之前的所有内容,并在当前域中查找 'jlaird'(我猜是进程运行所在的域)。

所以我需要一些方法来获取像 'DOMAIN_OR_MACHINE\USER_OR_GROUP' 这样的帐户字符串并从中获取一个 Principal 对象。解决方案...

  1. 使用上面字符串上方的原始帐户构造一个 NTAccount 对象。不幸的是,能够构造对象只是意味着输入字符串不为空。所以要到达任何地方,我们必须将对象转换为其他东西。就像一个 SID。
  2. 调用:NTAccount.Translate(typeof(SecurityIdentifier)).Value 并存储它返回的SID。

如果 SID 不为 NULL,我可以假设帐户字符串没问题(它存在)。那么……

  1. 使用斜杠作为分隔符从用户名或组名中分离出域名。使用斜杠之前的内容构建域上下文。
  2. 使用 #2 中的 SID 使用该域上下文对象调用 FindByIdentity。
  3. 如果 FindByIdentity 在域上下文中失败,请创建本地计算机上下文并使用相同的 SID 调用 FindByIdentity。

然后我有一个用户或组: a) 有效的“DOMAIN_OR_MACHINE\USER_OR_GROUP”格式的帐户字符串。b) 我知道它是域(和指定域的一部分)还是属于机器 c) 我通过查看 Principal 对象知道它是用户还是组。

所以这为我解决了这个问题。凌乱,我认为微软把这个过程变成了一个 PITA,但它有效。

如果这对其他人有用,请标记为答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么特征不能具有上下文边界参数

为什么对象实例中的枚举具有静态上下文?

为什么Catalyst中具有多个PSGI应用程序的授权上下文不起作用?

为什么我的 Ember 组件中的 .then() 中没有“this”上下文

为什么只有部分上下文菜单会触发 WPF 中的关联命令?

为什么在 WSO2 ESB 中我不能创建两个具有相同上下文值的不同 API?

为什么函数参数会引发列表上下文?

如何调用具有参数“上下文”的方法

为什么片段中的上下文为空?

为什么在Werkzeug中必须绑定上下文

为什么片段的上下文在lifecycleScope中为空

让具有“this”上下文的类中的变量

如果上下文相同,为什么在Android中在Toast上制作面包有什么关系呢?

为什么带有type参数的operator()可以应用于result_of上下文中的type?

为什么不安全的代码上下文(与指针操作有关)在C#中存在安全风险?

在上下文菜单中选择“在终端中打开”时,为什么没有源.profile?

为什么在示例中,有时仅在某些情况下节点全局上下文==='this'?

为什么在 formview django get 方法中没有传递上下文?姜戈,蟒蛇

为什么我在与声明的作用域相同的范围内使用“名称在当前上下文中不存在”错误

为什么在Docker容器中启动jar比在本地机器上启动jar要更快?

ECMAScript 中的“一组 ECMAScript 执行上下文”和“执行上下文堆栈”有什么区别

在C#中的程序集上下文中,激活作用域指的是什么?

在域驱动的开发中,休眠中的多个有界上下文之间共享实体

为什么在Tensorflow中定义带有上下文管理器和不带有上下文管理器的tf.Session会导致不同的行为?

为什么在 Python 的打印函数中传递给关键字参数 end 的参数没有在下面的上下文中按预期工作?

G机器(非严格)上下文-为什么案例表达式需要特殊处理

Kubernetes中的名称空间和上下文有什么区别?

为什么System.Decimal忽略已检查/未检查的上下文

Django 中 render() 函数的“上下文”参数有什么作用?