所以我有这个字符串:
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。为什么?
好吧,我没有完全掌握:
具有域上下文的 PrincipalContext 构造函数假定本地域。如果您不想假设一个域,则必须明确地告诉它在下一个参数中是哪个域。在机器上下文的情况下,您必须让它假设本地机器或在下一个参数中指定您想要的机器。
FindByIdentity 方法不关心斜线之前的任何内容。FindByIdentity 查找一种身份类型 (IdentityReference) 并默认为“名称”,即用户或组名称。它需要用户或组的名称,除非您指定不同类型的身份(如 SID),在这种情况下,它会在该上下文中查找 Principal。因此,在我的 'domain\jlaird' 情况下,它忽略了斜线之前的所有内容,并在当前域中查找 'jlaird'(我猜是进程运行所在的域)。
所以我需要一些方法来获取像 'DOMAIN_OR_MACHINE\USER_OR_GROUP' 这样的帐户字符串并从中获取一个 Principal 对象。解决方案...
如果 SID 不为 NULL,我可以假设帐户字符串没问题(它存在)。那么……
然后我有一个用户或组: a) 有效的“DOMAIN_OR_MACHINE\USER_OR_GROUP”格式的帐户字符串。b) 我知道它是域(和指定域的一部分)还是属于机器 c) 我通过查看 Principal 对象知道它是用户还是组。
所以这为我解决了这个问题。凌乱,我认为微软把这个过程变成了一个 PITA,但它有效。
如果这对其他人有用,请标记为答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句